设计模式学习笔记(二十)Chain of Responsibility 职责链(行为型模式)

 

背景:某些对象请求的接受者可能多种多样,变化无常……

动机(Motivation)

在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者。如果显式指定,必将带来请求发送者与接受者的紧耦合。

如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时来决定处理请求,从而使两者解耦。

意图(Intent)

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
                                ——《设计模式》GoF


示例代码

 


abstract class BaseHandler
{
 public BaseHandler(BaseHandler next)
 {
  this.next = next;
 }
 protected abstract bool CanHandleRequest();
 
 public virtual void HandleRequest(Request request);
 {
  if(next!=null)
  {
   this.netxt.HandleRequest(request);
  }
 }
 
 private BaseHandler next;
 
 public BaseHandler
 {
  get{return this.next;}
  set{this.next = value;}
 }
 
}

public class AHandler:BaseHandler
{
 public AHandler(BaseHandler next):base(next)
 {
 }
 
 protected override bool CanHandleRequest()
 {
  //...
  if(...)
   return true;
  else
   return false;
 }
 public override void HandleRequest(Request request)
 {
  if(this.CanHandleRequest())
  {
  
  }
  else
  {
   base.HandleRequest(request);
  }
 }
}

public class BHandler:BaseHandler
{
 public BHandler(BaseHandler next):base(next)
 {
 }
 protected override bool CanHandleRequest()
 {
  //...
  if(...)
   return true;
  else
   return false;
 }
 public override void HandleRequest(Request request)
 {
  if(this.CanHandleRequest())
  {
  
  }
  else
  {
   base.HandleRequest(request);
  }
 }
}


public class CHandler:BaseHandler
{
 public CHandler(BaseHandler next):base(next)
 {
 }
 public override bool CanHandleRequest()
 {
  //...
  if(...)
   return true;
  else
   return false;
 }
 public override void HandleRequest(Request request)
 {
  if(this.CanHandleRequest())
  {
  
  }
  else
  {
   base.HandleRequest(request);
  }
 }
}


//请求的发送者
public class Sender
{
 //此处的发送者只依赖一个抽象的接受者
 public void Process(BaseHandler handler)
 {
  Request request = new Request();
  handler.HandleRequest(request);
 }
}

 

public class App

 public static void Main()
 {
  Sender sender = new Sender();
  BaseHandler handler1 = new Ahandler(null);
  BaseHandler handler2 = new BHandler(handler1);
  BaseHandler handler3 = new CHandler(handler2);
 
  Sender.Process(handler3);
 }
}


Chain of Responsibility模式要点

1)Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,只有这时候请求发送者与接受者的耦合才有可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应用变化。
2)应用了Chain of Responsibility模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加删除请求的处理职责。
3)如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值