小话设计模式(番外一)插件模式

news/2024/11/24 8:40:08/

插件(Plugin)模式向用户提供了一种扩展程序的接口,用户可以在程序本体之外,按照指定接口编写插件来为程序增加功能。

可能实际开发中不太会运用到插件模式,但是它确实我们经常会使用到的一种模式。例如CocosBuilder和Unity3D都不同程度的提供了插件功能,用户可以自己编写插件来完善或者定制编辑器。此外,我们也可以编写Visual Studio、XCode或Eclipse的插件来扩展这些IDE。

插件模式中会有一个管理器用来管理这些插件,而如何调用插件的方法?这里我们就需要制定一个接口,插件必须实现接口方法,而管理器则调用这些方法。

插件抽象类:

public abstract class Plugin{public virtual void DoSomeThing (){}
}


如何知道插件的类型并实例化它们呢?我们可以使用反射(参考C#语法小知识(十)反射)+配置文件的方法来解决这个问题。

插件管理器:

public static class PluginManager
{private static Dictionary<string, Plugin> _plugins = new Dictionary<string, Plugin>();public static void LoadPlugin(string assemblyName, string typeStr){string key = assemblyName + typeStr;if (_plugins.ContainsKey (key)) {return;}var oh = System.Activator.CreateInstance (assemblyName, typeStr);object instance = oh.Unwrap ();_plugins [key] = (Plugin)instance;}public static void UnloadPlugin(string assemblyName, string typeStr){string key = assemblyName + typeStr;if (_plugins.ContainsKey (key)) {_plugins.Remove (key);}}public static void UnloadAllPlugins(){_plugins.Clear ();}public static void RunPlugins(){foreach (var kv in _plugins) {kv.Value.DoSomeThing ();}}
}


(示例中没有实现读取文件并加载插件的方法,需要根据实际情况来编写具体代码)

我们可以编写一个dll文件,并且添加测试插件:

public class TestPlugin : Plugin
{public override void DoSomeThing (){Console.WriteLine ("Test plugin");}
}


测试:

		PluginManager.LoadPlugin ("xxx.dll", "TestPlugin");PluginManager.RunPlugins ();


当然这种模式并不限于程序外开发,程序内开发我们也可以考虑使用这种模式。这样就与IOS里的NotificationCenter有些类似(观察者+单例,参考小话设计模式(十七)观察者模式),只不过插件管理器与事件发布者(示例中没有实现,可以认为测试代码中RunPlugins这个方法就是发布了一个事件)耦合度会更紧密一些。当然如果没有必要的话,尽量还是不要使用反射了。


插件模式的好处:

1、提供了扩展程序的可能。

2、将插件与事件发布者的耦合集中到插件管理器当中去,事件发布者并不需要知道插件中的具体逻辑,只负责发送事件。

3、增加插件也很方便

缺点在于,使用插件模式扩展程序,往往需要使用反射,这样就会影响程序的执行速度。



http://www.ppmy.cn/news/171778.html

相关文章

前言----小话c语言(1)

不知道该怎么开头&#xff0c;不过开头的几个字都写了&#xff0c;就继续写下去吧。 看过很多以大话开头的书籍&#xff0c;觉得也不怎么样&#xff0c;觉得还没达到大话的层次&#xff0c;本人本着谦虚的精神&#xff0c;暂且以小话开头吧&#xff1b;可能读者看完&#xff0c…

Git安装与仓库配置(附带)

Git的安装与仓库配置 前期准备安装与配置安装Git注册账户&#xff1a;环境配置配置用户名与邮箱&#xff1a;生成SSH添加SSH配置仓库仓库建立初始化仓库 提交文件操作&#xff1a; Git 的基本语法总结总结小话 前期准备 下载Git安装包&#xff08;根据需求不同选择安装Window/…

小故事

小故事 老和尚背姑娘 小和尚和老和尚下山化缘&#xff0c;走到河边&#xff0c;见一姑娘正发愁没法过河。老和尚对姑娘说&#xff1a;我把你背过去把&#xff0e;姑娘同意事后小和尚目瞪口呆&#xff0c;又不敢问。就这样又走了二十里路&#xff0e;实在忍不住了&#xff0c;就…

嵌入式Linux驱动开发 04:基于设备树的驱动开发

文章目录 目的基础说明开发准备设备树调整驱动程序与测试总结设备树文件内容 目的 前面文章 《嵌入式Linux驱动开发 03&#xff1a;平台&#xff08;platform&#xff09;总线驱动模型》 引入了资源和驱动分离的概念&#xff0c;这篇文章将在前面基础上更进一步&#xff0c;引…

这是一篇儿正儿八经的自我介绍~

你好啊朋友&#xff01;来到这儿我们就认识一下吧&#xff08;我真的不是来唠嗑的&#xff09; 关于我 性别&#xff1a;女年龄&#xff1a;00后坐标&#xff1a;陕西职业&#xff1a;双非本科在读大学生目前我的关注&#xff1a;别人的爱情、自己的财富、什么时候可以彻底解…

真的来了!百度文心一言APP在哪里下载?跟网页版有什么区别?

此前百度公开宣布文心一言没有APP&#xff0c;所有文心一言APP都是假的。并针对文心一言盗版APP进行举证上诉&#xff0c;还对苹果应用商店起诉。时隔半个多月&#xff0c;今天上午&#xff0c;小宝在文心一言官方网站上看到内测专用APP下载链接&#xff0c;真正的文心一言APP终…

小话驱动程序

驱动程序(Device Driver)是什么呢&#xff1f;有什么作用呢&#xff1f; 答&#xff1a;驱动程序是一种程序&#xff0c;是软的&#xff0c;没有重量&#xff0c;没有味道&#xff0c;类似于我们平常写的C程序。驱动程序用来驱动I/O硬件设备&#xff0c;缺乏这个驱动程序&#…

要理解解释器,做一个小解释器----小话c语言(20)

作者&#xff1a;陈曦 日期&#xff1a;2012-6-12 11:31:12 环境&#xff1a;[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1 xcode4.2] 转载请注明出处 Q&#xff1a; 解释器来源于什么&#xff1f; A&#xff1a; 如果说是广义的解释器&#xff0c;那么可以把它理解…