23种设计模式之责任链模式(Chain of Responsibility)

责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理。

优点:

1)降低了耦合度。

2)增加向对象指定责任的灵活性。

3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体。

使用场景:

1)多个对象可以处理一个请求,而其处理器却是未知的。

2)想要在不指定确切的请求接收对象的情况下,向几个对象中的一个发送请求。

3)可以动态地指定能够处理请求的对象集。

Chain of Responsibility 模式

/// <summary>
/// 采购需求实体类
/// </summary>
public class PurchaseRequest
{
   public double amount;//一个采购的金额
   public int number;//采购单编号
   public string purpose;//采购目的
}  
/// <summary>
/// 审批类
/// </summary>
public class Approver
{
    public Approver()
    {
        successor = null;//初始化为null
    }  

    /// <summary>
    /// 处理审批
     /// </summary>
    /// <param name="aRequest">审批请求</param>
    public void ProcessRequest(PurchaseRequest aRequest)
    {
        if (successor != null)
        {
            successor.ProcessRequest(aRequest);
        }
    }  

    /// <summary>
    /// 设置审批对象
     /// </summary>
    /// <param name="aSuccessor">具体审批对象</param>
    public void SetSuccessor(Approver aSuccessor)
    {
        successor = aSuccessor;
    }  

    private Approver successor;//实例化审批对象
} 
/// <summary>
/// 会议讨论类
/// </summary>
public class Congress : Approver
{
    public void ProcessRequest(PurchaseRequest aRequest)
    {
        if (aRequest.amount >= 500000)
        {
            Console.WriteLine("正在创建:会议讨论对象...");
            Console.WriteLine(">=500000的由开会讨论决定");
        }
        else
        {
            base.ProcessRequest(aRequest);
        }
    }
}  
/// <summary>
/// 董事长类
/// </summary>
public class President : Approver
{
    public new void ProcessRequest(PurchaseRequest aRequest)
    {
        if (aRequest.amount >= 100000 && aRequest.amount < 500000)
        {
            Console.WriteLine("正在创建:董事长对象...");
            Console.WriteLine("金额为:" + aRequest.amount + "的由董事长决定");
        }
        else
        {
            Console.WriteLine("董事长无权审批该采购项目,向上由会议讨论决定");
            new Congress().ProcessRequest(aRequest);
        }
    }
}  
/// <summary>
/// 副董事长类
/// </summary>
public class VicePresident : Approver
{
    public new void ProcessRequest(PurchaseRequest aRequest)
    {
        if (aRequest.amount >= 50000 && aRequest.amount < 100000)
        {
            Console.WriteLine("正在创建:副董事长对象...");
            Console.WriteLine("金额为:" + aRequest.amount + "的由副董事长决定");
        }
        else
        {
            Console.WriteLine("副董事长无权审批该采购项目,向上给董事长审批");
            new President().ProcessRequest(aRequest);
        }
    }
}  
/// <summary>
/// 主任类
/// </summary>
public class Director : Approver
{
    public new void ProcessRequest(PurchaseRequest aRequest)
    {
        if (aRequest.amount < 50000)
        {
            Console.WriteLine("正在创建:主任对象...");
            Console.WriteLine("金额为:" + aRequest.amount + "的由主任决定");
        }
        else
        {
            Console.WriteLine("主任无权审批该采购项目,向上给副董事长审批");
            new VicePresident().ProcessRequest(aRequest);
        }
    }
}  
class Program
{
    static void Main(string[] args)
    {
        //责任链设计模式
        Congress Meeting = new Congress();
        President Tammy = new President();
        VicePresident Sam = new VicePresident();
        Director Larry = new Director();  

        //构造责任链
        Meeting.SetSuccessor(null);
        Tammy.SetSuccessor(Meeting);
        Sam.SetSuccessor(Tammy);
        Larry.SetSuccessor(Sam);  

        while (1 == 1)
        {
            Console.WriteLine("/r/n请输入采购项目的金额:");
            PurchaseRequest aRequest = new PurchaseRequest();
            aRequest.amount = Convert.ToDouble(Console.ReadLine());
            Larry.ProcessRequest(aRequest);
        }
    }
} 

时间: 2024-08-07 00:15:24

23种设计模式之责任链模式(Chain of Responsibility)的相关文章

设计模式 笔记 责任链模式 chain of responsibility

//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链-----对象行为型模式 /* 1:意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象 连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2:动机: 3:适用性: 1>有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 2>你想在不明确指定

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

责任链模式-Chain of Responsibility(Java实现), 例1

责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. Trouble类 本类是:待责任链来处理的问题Trouble类. 本例子较简单, Trouble只有一个int型作为待处理的编号. public class Trouble { private int number; public Trouble(int number) { this.number

设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合.将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理. UML类图: 主要包含: Handler:定义了一个处理请求的接口,实现了定义后继者的方法. ConcreteHandler:处理各自负责的请求,假设不能处

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

[设计模式] 责任链模式 Chain of Responsibility

转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向项目主管提交了我的休假申请,项目主管向部门经理提交了我的休假申请:最后,部门经理同意了我的休假申请.是的,一个简单的休假申请,需要这么复杂的流程,这也是一个公司保证它正常运行的必要.如果部门经理休假了,那么我的休假申请由谁审批呢?这个时候由项目主管代替部门经理进行审批.一个休假申请的审批制度有着严格

行为型设计模式之职责链模式(Chain of Responsibility)

结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 1 using System; 2 3 abstract class Handler 4 { 5 protected Handler successorHand

B5:责任链模式 Chain Of Responsibility

使多个对象都有机会处理处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着该链处理请求,直到有一个对象能够处理它为止. UML 示例代码: abstract class Handle { protected $nextHandle; public function setNextHandle(Handle $handle) { $this->nextHandle = $handle; } abstract public function handleRequest(

责任链模式(Chain of responsibility pattern)

鲁春利的工作笔记,好记性不如烂笔头 本文出自 "闷葫芦的世界" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1892886