`
liss
  • 浏览: 831238 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

责任链模式(Chain of Responsibility Pattern)

阅读更多

(1)应用:
 应用责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
(2)角色
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
(3)故事
话说悟空向东海龙王强夺了定海神针,却又来索要披挂
  悟空道:“当时若无此铁,倒也罢了,如今手中既拿着他,身上更无衣服相趁,奈何?你这里若有披挂,索性送我一副,一总奉谢。”龙王道:“这个却是没有。”悟空道:“一客不犯二主,若没有,我也定不出此门。”龙王道:“烦上仙再转一海,或者有之。”悟空又道:“走三家不如坐一家,千万告求一副。”龙王道:“委的没有,如有即当奉承。”悟空道:“真个没有,就和你试试此铁!”龙王慌了道:“上仙,切莫动手,切莫动手!待我看舍弟处可有,当送一副。”
 .......
少时,钟鼓响处,果然惊动那三海龙王。须臾来到,一齐在外面会着。敖钦道:“大哥,有甚紧事,擂鼓撞钟?”老龙道:“贤弟,不好说!有一个花果山什么天生圣人,早间来认我做邻居,后要求一件兵器,献钢叉嫌小,奉画戟嫌轻,将一块天河定底神珍铁,自己拿出手,丢了些解数。如今坐在宫中,又要索什么披挂。我处无有,故响钟鸣鼓,请贤弟来。你们可有什么披挂,送他一副,打发出门去罢了。”敖钦闻言,大怒道:“我兄弟们点起兵,拿他不是!”老龙道:“莫说拿,莫说拿!那块铁,挽着些儿就死,磕着些儿就亡,挨挨儿皮破,擦擦儿筋伤!”西海龙王敖闰说:“二哥不可与他动手,且只凑副披挂与他,打发他出了门,启表奏上上天,天自诛也。”北海龙王敖顺道:“说的是。我这里有一双藕丝步云履哩。”西海龙王敖闰道:“我带了一副锁子黄金甲哩。”南海龙王敖钦道:“我有一顶凤翅紫金冠哩。”老龙大喜,引入水晶宫相见了,以此奉上。悟空将金冠、金甲、云履都穿戴停当,使动如意棒,一路打出去,对众龙道:“聒噪,聒噪!”四海龙王甚是不平,一边商议进表上奏不题。斋
(4)分析
 1.东海龙王敖广 有权给定海神针
 2.北海龙王敖顺 有权给藕丝步云履
 3.西海龙王敖闰 有权给锁子黄金甲
 4.南海龙王敖钦 有权给凤翅紫金冠
有趣的是美猴王却不找其它三家,认定了"走三家不如坐一家",只找敖广一个人
 (5)实现
 
using System;

public enum 武器枚举{定海神针,藕丝步云履,锁子黄金甲,凤翅紫金冠,我还要};
public abstract class 负责人 {
    protected string 姓名;
    protected 武器枚举 武器;
    protected 负责人 下一个负责人;
    public 负责人(string 姓名,武器枚举 武器){
        this.武器=武器;
        this.姓名=姓名;
    }
    public void 设置下一个负责人(负责人 下一个负责人) {
        this.下一个负责人 = 下一个负责人;
    }
    public abstract void 处理请求(美猴王 孙悟空,武器枚举 武器);
}

public class 龙王 : 负责人 {
    public 龙王(string 姓名, 武器枚举 武器):base(姓名,武器){}
    public override void 处理请求(美猴王 孙悟空, 武器枚举 武器)
    {
        if (this.武器 == 武器)
        {
            Console.WriteLine(姓名+"说:我有,我给");
            孙悟空.接收(武器);
        }
        else {
            if (下一个负责人 != null) {
                Console.WriteLine(姓名 + "说:我没有,转给下一个人处理");
                下一个负责人.处理请求(孙悟空,武器);
            }
            else {
                Console.WriteLine(姓名 + "我们都没有了,找玉帝去要吧");
            }
        }
    }
}
public class 责任链 {
    public 负责人 责任链入口;
    public 责任链()
    {
        负责人 东海龙王敖广 = new 龙王("东海龙王敖广", 武器枚举.定海神针);
        负责人 北海龙王敖顺 = new 龙王("北海龙王敖顺", 武器枚举.凤翅紫金冠);
        负责人 西海龙王敖闰 = new 龙王("西海龙王敖闰", 武器枚举.藕丝步云履);
        负责人 南海龙王敖钦 = new 龙王("南海龙王敖钦", 武器枚举.锁子黄金甲);
        东海龙王敖广.设置下一个负责人(北海龙王敖顺);
        北海龙王敖顺.设置下一个负责人(西海龙王敖闰);
        西海龙王敖闰.设置下一个负责人(南海龙王敖钦);
        责任链入口 = 东海龙王敖广;
    }
}

public class 美猴王 {
    public void 索要(责任链 四海龙王,武器枚举 武器) {
        Console.WriteLine("美猴王说:\t我要"+武器.ToString());
        四海龙王.责任链入口.处理请求(this, 武器);
    }
    public void 接收(武器枚举 武器) {
        Console.WriteLine("美猴王说:\t我收到" + 武器.ToString());          
    }
}

public class 大闹水晶宫 {
   public static void Main(){
       责任链 四海龙王 = new 责任链();
       美猴王 孙悟空 = new 美猴王();
       孙悟空.索要(四海龙王, 武器枚举.定海神针);
       孙悟空.索要(四海龙王, 武器枚举.凤翅紫金冠);
       孙悟空.索要(四海龙王, 武器枚举.藕丝步云履);
       孙悟空.索要(四海龙王, 武器枚举.锁子黄金甲);
       孙悟空.索要(四海龙王, 武器枚举.我还要);
      
        Console.Read();
    }
}


 (6)结果
美猴王说:       我要定海神针
东海龙王敖广说:我有,我给
美猴王说:       我收到定海神针
美猴王说:       我要凤翅紫金冠
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我有,我给
美猴王说:       我收到凤翅紫金冠
美猴王说:       我要藕丝步云履
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我有,我给
美猴王说:       我收到藕丝步云履
美猴王说:       我要锁子黄金甲
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我没有,转给下一个人处理
南海龙王敖钦说:我有,我给
美猴王说:       我收到锁子黄金甲
美猴王说:       我要我还要
东海龙王敖广说:我没有,转给下一个人处理
北海龙王敖顺说:我没有,转给下一个人处理
西海龙王敖闰说:我没有,转给下一个人处理
南海龙王敖钦我们都没有了,找玉帝去要吧


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackant2/archive/2006/10/07/1324286.aspx

分享到:
评论

相关推荐

    设计模式 - Chain of Responsibility Pattern(责任链模式)

    NULL 博文链接:https://linkcqu.iteye.com/blog/355806

    chain of responsibility.pptx

    责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。 使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有...

    C#版 24种设计模式

    适配器模式(Adapter Pattern) 提供者模式(Provider Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 原型模式(Prototype Pattern) 责任链模式(Chain of Responsibility Pattern) 中介者模式...

    wuyading#study#责任链模式2

    介绍顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者

    用Java实现23种设计模式

    责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 备忘录模式(Memento ...

    设计模式PPT

     责任链模式(Chain of Responsibility Pattern)  命令模式(Command Pattern)  解释器模式(Interpreter Pattern)  迭代器模式(Iterator Pattern)  中介者模式(Mediator Pattern)  备忘录模式...

    责任链模式

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton ... 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    C#设计模式(23种设计模式)

    职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern) @Author kwming

    33种JAVA设计模式DEMO

    责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 备忘录模式(Memento Pattern) ...

    java常用设计模式-责任链模式

    责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理链进行传递,直到有一个处理程序处理它为止。在 Java 中实现责任链模式通常需要以下几个步骤: 定义处理器接口 首先,...

    设计模式代码——c#

    C#设计模式(23种设计...19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    23种设计模式 (创建型,结构型,行为型)

    创建型: ... 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    C++设计模式(Design Pattern)范例源代码

    责任链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板...

    chain_of_responsibility:Ruby的责任链模式实现

    责任链 安装 将此行添加到您的应用程序的Gemfile中: gem "chain_of_responsibility" 然后执行: $ bundle 或将其自己安装为: $ gem install chain_of_responsibility 关于 前段时间,我偶然发现Sergii Makagon...

    32种设计模式

    职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    36种最新设计模式整理

    Design Pattern: Chain of Responsibility 模式 53 Design Pattern: Command 模式 59 Design Pattern: Interpreter 模式 Design Pattern: Iterator 模式 Mediator 模式 Memento 模式 Observer 模式 State ...

    Python 程序语言设计模式思路-行为型模式:职责链模式:将请求从一个处理者传递到下一个处理者

    职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在将请求从一个处理者传递到下一个处理者,直到请求被处理或到达链的末端。职责链模式通过将请求的发送者和接收者解耦,使得多个对象都有...

    C#设计模式-吕震宇

    设计模式(17)-Chain of Responsibility Pattern 设计模式(16)-Bridge Pattern 设计模式(15)-Facade Pattern 设计模式(14)-Flyweight Pattern C#设计模式(13)-Proxy Pattern C#设计模式(12)-...

Global site tag (gtag.js) - Google Analytics