您的位置:首页 > 其它

.NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证

2014-05-25 00:17 330 查看

.NET责任链模式、单例模式、模板方法模式混用

前言

  哇,看到题目挺长的,这个组合型的东西,到底能干啥呢?本篇文章来一起琢磨琢磨,这两天为了团队的软件赶工,我负责的那一块叫:插件管理器。我们团队的成员用的语言还是挺分散的,本人C#,队长VB.NET,还有其他成员写易语言等,系统的功能插件是我们分开写的,各自用各自的喜欢的语言写各个功能模块的插件,最后用我开发的插件管理器把所有的插件整合到一起。这让我很头疼啊,一个C#版的插件,一个VB.NET版的插件,一个易语言的插件,如果有新成员加入,又来个Python版的插件,叫我如何是好。最普通、最烂的处理方法就是:写很多版本的读取器,然后使用if来根据插件语言使用对应该版本的读取器读取信息,哇,这如果来十几种语言,岂不是坑爹。可能有人会说:引入Kernel32能解决非.NET语言的插件读取吧。确实目前使用了这种方案,能兼容易语言,.NET语言就使用.NET的插件Dll读取方式,但是还不确定Kernel32能不能解决任何语言的插件。所以为了让自己有个后路,我结合题目所说的三种设计模式,写了一个模板,下面看这个模板能干嘛,为什么要这样用。如果有地方使用得不恰当的,希望各位朋友们强拍,我会努力学习改正,如果觉得可以的,点个推荐,谢谢~

框架展示与说明

     

class Programe
{
public static void Main(string[] args)
{
IPluginAnalyzerable dotnetAnalyzer=ComponentAnalyzer.GetInstance();
Console.WriteLine("输入Q退出");
while(true)
{
Plugin plugin = RandomPlugin();
dotnetAnalyzer.Analyze(plugin);
if (Console.ReadLine().ToUpper() == "Q")
{
break;
}
}
}
private static Plugin RandomPlugin()
{
Random random = new Random();
PluginType type = (PluginType)random.Next(0, 2);
String plaginPath = Path.GetRandomFileName();
Plugin result = new Plugin(type, plaginPath);
return result;
}
}


View Code
   测试结果:

看,以一致的方式执行,但是会得到不一样的效果,责任被推到合适的地方做出相应的处理。

  到这里有人会说,那如何证明该模型的扩展性?? 好,下面我扩展一种语言读取器,看我改了多少,对系统影响了多少?

扩展性测试

   我以Ruby为例。

    1.在PluginType中添加一个枚举内容Ruby:



    2.添加一个Ruby读取器:


    3.在ComponentAnalyzer(前面说的包装器)中,把该读取器添加到链条上!


    

    为了测试,在客户端代码中修改Random随机生成数,使其能生成3,大功告成!(这是测试相关,我们没有修改实际客户端任何代码)

    

顺利扩展!!!我们修改的只是上层的代码,对于底层,也提供了扩展点,符合对修改封闭,对扩展开放。

总结

  完成了,大家也累了,希望有不对的地方大家大力拍,面向组合编程,面向接口编程,不要面向具体实现类编程,这是我学习设计模式感受最深的一句话。谢谢大家观看。下面提供完整源码。

完整Demo下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: