首页 > 代码库 > 23种设计模式之责任链模式(Chain of Responsibility)

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);  
        }  
    }  
} 

技术分享

 

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