基于.net 职责链来实现 插件模式

    •   插件式的例子
  1. QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了
  2. eclipse ,X Server 等等
    •   插件式的好处
  1. 插件降低框架的复杂性,把扩展功能从框架中剥离出来
  2. 让第三方有机会来扩展程序的功能
    •   思路

      公开一个插件接口,如果.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;
                }
            }
        }

      

时间: 2024-10-11 16:45:18

基于.net 职责链来实现 插件模式的相关文章

C++设计模式实现--职责链(Chain of Responsibility)模式

一. 概述 职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个例子 员工要求加薪 公司的管理者一共有三级:总经理.总监.经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监.总监的处理方式也一样,总经理可以处理所有请求.这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求. 结构图如下: 假

javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调用和联动. 切换要求:当前图片显示指定时间后执行切换效果并切换下一张图片,最后一个切换后从头开始. 按照要求一个效果对象完成后要执行下一个,最后一个完成后要从头开始, 看上去就是一个带状态通知的环形列表,类似于这样的特征,可以采用职责链模式来构建. 职责链就是由不同的功能处理构成的链表,每一个功能处理作为一个

设计模式值职责链模式(行为型)

目录 一.行为型模式 二.职责链模式定义 三.职责链模式角色 四.简单实例 五.模式应用 一.行为型模式 介绍职责链模式之前先介绍一下行为型设计模式,因为按照GoF模式分类,职责链就是一种行为型设计模式.行为型设计模式就是主要表示类或者对象之间的关联关系,分为类行为型和对象行为型.类行为型一般都是通过类的继承或者多态等等方式实现.对象行为型就是通过对象的聚合等等关联实现. 二.职责链模式定义 职责链模式是一种对象行为型模式.根据"合成复用"原则,尽量使用关联来取代类继承,对象行为型可以

[设计模式]&lt;6&gt;. C++与职责链模式(chain of rsponsibility pattern)

默默地EEer,原文地址: http://www.cnblogs.com/hebaichuanyeah/p/5625233.html 职责链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系. 将这些接受处理的对象连成一条链,并沿着该链处理请求. 一个传说中的应用情景: 假如去政府部门办事,遇到了打字员小丽,在打LOL的小张以及主任老李,互相踢皮球推脱. #include <iostream> using namespace std; class Handler { prote

职责链模式

1.职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,指导有一个对象处理它为止. 2.优点:(1).当客户提交一个申请时,请求是沿链传递直至有一个对象负责处理它位置.在客户端根本不需要知道是谁做的处理.(2).简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用.(3).可以随时增加或者修改处理一个请求的结构.增强了给对象纸牌职责的灵活性. 3.注意:一个请求极有可能到链的末端都

设计模式之行为型模式—— 3.5 职责链模式

<?php /**  * 3.5 职责链模式  *  定义:  *  使多个对象都有机会处理请求,从而避免请求的  *  发送者和接受者直接的耦合关系.将这个对象连  *  成一条链,并沿着这条链传递该请求,直到有一  *  个对象处理它为止.  *  角色:  *  1. 抽象Handler类  *  职责:定义一个处理请示的接口.  *  2. 具体Handler类  *  职责:具体处理者类,处理它所负责的请求  *    ,它可访问它的后继者,如果可处理  *    该请求,就处理之,否

大话设计模式C++实现-第24章-职责链模式

一.UML图 二.概念 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止. 三.说明  角色: (1)Handler类:定义一个处理请求的接口. (2)ConcreteHandler类:具体的处理请求的接口. 职责链模式的好处: (1)最关键的是,当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它. (2)

职责链模式——机房收费系统下机结账

在机房收费系统中,学生下机结账最让人头疼了.因为学生的消费时间(下机时间-上机时间-上机准备时间)有三种情况: 1.消费时间<=0,也就是下机时间与上机时间的间隔在上机准备时间范围内,这种情况是不收费的. 2.消费时间<=最少上机时间,这种情况下消费时间按照最少上机时间收费. 3.消费时间>最少上机时间,这种情况还要考虑递增单位时间.比如递增单位时间是10分钟,消费时间是42分 钟,42/10=4.....2,这种情况要按照50分钟收费. 以上消费时间就分了三种情况,更复杂的是第二种和第

职责链模式Chain of Responsibility

1.简介 1)模式概述:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它位置. 2)核心: 2.UML与代码实现 1)结构:UML 模式组成: 抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选) 具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者. 客户类