.net 职责链来实现 插件模式
- 插件式的例子
- QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了
- eclipse ,X Server 等等
- 插件式的好处
- 插件降低框架的复杂性,把扩展功能从框架中剥离出来
- 让第三方有机会来扩展程序的功能
- 思路
公开一个插件接口,如果.DLL或.EXE的代码中有继承这个接口就将其示为插件,并将这些插件放在同一目录。运行程序的时候扫描目 录并通过反射判断.DLL或.EXE中是否存在该接口,若存在,则当作插件加载进来。如下图示

- 基于.net 职责链来实现 插件模式
1.定义命令接口
public interface ICommand
{
ServerReturn execute(); ServerReturn Rollback();
}
获取当前目录下继承该接口的方法

public List<ICommand> CommandList()
{
List<ICommand> ICommandList = new List<ICommand>();
string[] files = Directory.GetFiles(System.IO.Directory.GetCurrentDirectory());
int i = 0; foreach (string file in files)
{
string ext = file.Substring(file.LastIndexOf("."));
if (ext != ".dll") continue;
try
{
// 加载插件
Assembly tmp = Assembly.LoadFile(file);
Type[] types = tmp.GetTypes();
bool ok = false;
foreach (Type t in types)
if (IsValidCommand(t))
{
// 通过反射实例化
ICommand plugin = (ICommand)tmp.CreateInstance(t.FullName);
ICommandList.Add(plugin);
ok = true;
if (ok) break;
}
}
catch (Exception err)
{
throw err;
}
} return ICommandList; } /// <summary>
/// 判断DLL中是否继承了ICommand接口
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
private static bool IsValidCommand(Type t)
{
bool ret = false;
Type[] interfaces = t.GetInterfaces();
foreach (Type theInterface in interfaces)
{
if (theInterface.FullName == "ClassDemo.ICommand")
{
ret = true;
break;
}
}
return ret;
}

职责链执行方法组

/// <summary>
/// 方法执行
/// </summary>
public void exec()
{
List<ICommand> list = new List<ICommand>();
foreach( ICommand demo in list)
{
if(!demo.execute().isSurccess)
{
demo.Rollback();
return;
}
}
}

.net 职责链来实现 插件模式的更多相关文章
- 基于.net 职责链来实现 插件模式
插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能从框架中剥离出来 让第三方有机会来 ...
- 职责链(Chain of Responsibility)模式在航空货运中的运用实例
设计模式这东西,基本上属于“看懂一瞬间,用会好几年”.只有实际开发中,当某一模式很好的满足了业务需求时,才会有真切的感觉.借用一句<闪电侠>中,绿箭侠教导闪电侠的台词:“不是你碰巧遇到了它 ...
- C++设计模式实现--职责链(Chain of Responsibility)模式
一. 概述 职责链模式: 使多个对象都有机会处理请求.从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个样例 员工要求加薪 ...
- 设计模式C++描述----05.职责链(Chain of Responsibility)模式
一. 概述 职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个例子 员工要求加薪 ...
- javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...
- JavaScript之职责链模式
一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...
- C#设计模式系列:职责链模式(Chain of Responsibility)
1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...
- php实现设计模式之 职责链模式
<?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...
- Filter体现职责链模式
1. 前言 Filter—Filter 技术是servlet2.3 新增加的功能.完成的流程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后 ...
随机推荐
- 3.cocos2dx它Menu,由menu为了实现场景切换
1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; ...
- js Array 阵列扩展方法
//又来了 Array.prototype.unique = function() { this.sort(); var re=[this[0]]; for(var i = 1; i < thi ...
- AndroidMainifest标签说明2——<activity>
格公式: <activity android:allowTaskReparenting=["true" | "false"] android:always ...
- 网络的基本概念TCP, UDP, 单播(Unicast), 多播(多播)(Multicast)
章相当低级,但相当重要! 我们周围一切差点儿都依赖于把事情抽象成低等级,并在某一点把它详细化,在一些设计概念中.接口层十分清晰而且目标非常集中,应用程序不用考虑操作系统怎样工作,操作系统也不用考虑硬件 ...
- Canvas的quadraticCurveTo 和 bezierCurveTo 画曲线 方法细说
详细代码如下: <!doctype html> <html lang="en"> <head> <script src="htt ...
- git常用命令学习(转)
一.Bug分支 1,假设如下场景,你正在dev分支工作,突然接到一个修复代号为101的bug的任务时,dev的东西还没不能提交,但是bug需要马上修复. Git提供了一个stash功能,可以把当前工作 ...
- Run Book Automation - RBA系统介绍
什么是RBA系统? 介绍这个系统之前, 先介绍一下开发这个系统的公司. BMC BMC软件公司是全球率先的业务服务管理解决方式的开发及供应商,现为全球第六大独立软件公司. 通过帮助用户主动提升服务.降 ...
- 【SSH2(理论+实践)】--Hibernate步步(一个)
前几个博客讨论SSH2该框架Struts,它代表层,集成封装.和使用WebWork作为核心处理,依赖映射是它的处理核心.在使用时需要Struts.xml配置相应Action和Interceptor够完 ...
- iOS6和iOS7适应代码(6) —— NSLocalizedString
我们的应用程序都需要国际化,字符串的重要组成部分.一般来说.我们是通过一个string资源文件来达到这个目的,我们需要支持多国语言,有多少次把这个文档本地化.需要使用的代码NSLocalizedStr ...
- C++ Regsvr32订购具体解释
一.Regsvr32命令 Regsvr 32命令是Windows在控制文件(如延长DLL.OCX.CPL文件)注册和反注册工具. 命令格公式:Regsvr32 [/s] [/n] [/i[:cmdli ...