天天看点

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

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

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

优点:

1)降低了耦合度。

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

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

使用场景:

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

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

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

Chain of Responsibility 模式

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

/// 采购需求实体类

public class PurchaseRequest

public double amount;//一个采购的金额

public int number;//采购单编号

public string purpose;//采购目的

/// 审批类

public class Approver

public Approver()

successor = null;//初始化为null

/// 处理审批

/// <param name="aRequest">审批请求</param>

public void ProcessRequest(PurchaseRequest aRequest)

if (successor != null)

successor.ProcessRequest(aRequest);

/// 设置审批对象

/// <param name="aSuccessor">具体审批对象</param>

public void SetSuccessor(Approver aSuccessor)

successor = aSuccessor;

private Approver successor;//实例化审批对象

/// 会议讨论类

public class Congress : Approver

if (aRequest.amount >= 500000)

Console.WriteLine("正在创建:会议讨论对象...");

Console.WriteLine(">=500000的由开会讨论决定");

base.ProcessRequest(aRequest);

/// 董事长类

public class President : Approver

if (aRequest.amount >= 100000 && aRequest.amount < 500000)

Console.WriteLine("正在创建:董事长对象...");

Console.WriteLine("金额为:" + aRequest.amount + "的由董事长决定");

Console.WriteLine("董事长无权审批该采购项目,向上由会议讨论决定");

new Congress().ProcessRequest(aRequest);

/// 主任类

public class Director : Approver

if (aRequest.amount < 50000)

Console.WriteLine("正在创建:主任对象...");

Console.WriteLine("金额为:" + aRequest.amount + "的由主任决定");

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)

继续阅读