职责链模式模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它为止。
Handler 类, 定义一个处理请示的接口:
abstract class Handler{
public Hanlder successor;
protected void SetSuccessor(Handler handler){ //设置继任者
this.successor = successor;
}
public abstract void HandleRequest(int request); //处理请求的抽象方法
}
ConcreteHandler 类, 具体处理类, 处理它所负责的请求, 可访问它的后继者, 如果可处理该请求,就处理之,否则就将该请求转发给它的后继者
ConcreteHAndler1, 当请求数在1-10 之间则有权处理, 否则转到下一位
class ConcreteHandler1 : Handler{
public override void HandlerRequest(int request){
if(request >= 0 && request < 10){ //0-10 处理此请求
Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
}
else if(successor != null) {
successor.HAndleRequest(request); //转移到下一位
}
}
}
ConcreteHandler2, 当请求数在10-20之间则有权处理,否则转移下一位
class ConcreteHandler2 : Handler{
public override void HandlerRequest(int request){
if(request >= 10 && request < 20){ //10-20 处理此请求
Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
}
else if(successor != null) {
successor.HAndleRequest(request); //转移到下一位
}
}
}
ConcreteHAndler3 , 当请求数在20-30之间则有权处理,否则转移下一位
class ConcreteHandler3 : Handler{
public override void HandlerRequest(int request){
if(request >= 20 && request < 30){ //20-30 处理此请求
Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
}
else if(successor != null) {
successor.HAndleRequest(request); //转移到下一位
}
}
}
客户代码,向链上的具体处理者对象提交请求
static void Main(string[] args){
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHAndler3();
h1.SetSuccesstor(h2); //设置职责链上下家
h2.SetSuccesstor(h3);
int[] request = {2,5,14,22,18,27};
foreach(int request in requests) { //循环给最小处理者提交请求, 不同的数额,有不同权限处理者处理
h1.HandleRequest(request);
}
Console.Read();
}
职责链的好处:
当客户提交一个请求时, 请求是沿链传递直至有一个ConcreteHandler 对象负责处理它。
接收者和发送者都没有对方的明确信息, 且链中的对象自己也并不知道链的结构。 如果职责链可以简化对象的相互连接,它们仅需保持一个指向后继者的引用, 而不需要保持它所有的候选接受者的引用。这也就大大地降低了耦合
由于是在客户端来定义链的结构, 故我们可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。
但也要注意: 一个请求很有可能到了链的末端都得不到处理, 或者因为没有正确配置而得不到处理。