补-计划模式之责任链模式(十一)

计算机软件开发 2024-10-1 04:49:53 36 0 来自 中国
1.jpg
 小明是一家公司的员工,因来日诰日有事,须要举行请假,可批假的领导有部分负责人、副总司理、总司理等。请2天以下部分负责人可以直接处置惩罚,假如请4天以下的副总司理可以处置惩罚,请6天以下就须要总司理处置惩罚。这也是一个计划模式的表现,那就是责任链模式。
2.png  责任链模式(Chain of Responsibility)使多个对象都有机会处置惩罚哀求,从而克制哀求的发送者和吸取者之间的耦合关系,将这个对象连成一条链,并沿着这条链通报该哀求,直到有一个对象处置惩罚它为止。(注:责任链模式也叫职责链模式)


  • 抽象处置惩罚者(Handler)脚色
      界说一个处置惩罚哀求的接口,包罗抽象处置惩罚方法和一个后继毗连。
  • 具体处置惩罚者(Concrete Handler)脚色
      实现抽象处置惩罚者的处置惩罚方法,判定能否处置惩罚本次哀求,假如可以处置惩罚哀求则处置惩罚,否则将该哀求转给它的后继者。
  • 客户类(Client)脚色
      创建处置惩罚链,并向链头的具体处置惩罚者对象提交哀求,它不关心处置惩罚细节和哀求的通报过程。


  • 抽象处置惩罚者
public abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {    this.successor = successor;}public abstract void HandleRequest (int request) ;}

  • 具体处置惩罚者
public class ConcreteHandler1 extends  Handler {@Overridepublic void HandleRequest(int request) {    if (request >= 0 && request <10) {        System.out.println("ConcreteHandler1处置惩罚哀求"+request);    } else if (successor != null) {        // 让下一个负责人继承处置惩罚        successor.HandleRequest(request);    }}}public class ConcreteHandler2 extends Handler {    @Override    public void HandleRequest(int request) {         if (request >= 10 && request<20) {             System.out.println("ConcreteHandler2处置惩罚哀求:"+request);         } else if (successor !=null) {             successor.HandleRequest(request);         }    }}public class ConcreteHandler3 extends  Handler {      @Override      public void HandleRequest(int request) {          if (request >=20 && request<30) {             System.out.println("ConcreteHandler3处置惩罚哀求:"+request);          } else if (successor !=null) {            successor.HandleRequest(request);          }       }}

  • 测试类
  public class HandlerTest {     public static void main(String[] args) {           Handler h1 = new ConcreteHandler1();           Handler h2 = new ConcreteHandler2();           Handler h3 = new ConcreteHandler3();           h1.setSuccessor(h2);           h2.setSuccessor(h3);           int[] requests = {2,5,14,22,18,3,27,20};           for (int request:requests) {              h1.HandleRequest(request);           }      }}

  • 测试结果
ConcreteHandler1处置惩罚哀求2ConcreteHandler1处置惩罚哀求5ConcreteHandler2处置惩罚哀求:14ConcreteHandler3处置惩罚哀求:22ConcreteHandler2处置惩罚哀求:18ConcreteHandler1处置惩罚哀求3ConcreteHandler3处置惩罚哀求:27ConcreteHandler3处置惩罚哀求:20

  • 优点
  责任链中的对象并不知道链的布局,结果是责任链可简化对象的相互毗连,它们仅须要一个指向下一个办理者的引用,而无需保持对象中全部环境都对吸取者引用。这也就打打低沉了耦合度。
  责任链模式比较机动,可以随时增长大概修改处置惩罚一个哀求的布局,增长了对象指派职责的机动性。
  责任分担,每个类只须要处置惩罚自己的工作,不应 处置惩罚通报给下一个对象完成,明白各类的责任方位,符合类的单一职责原则。
  克制在一个类中使用浩繁的if大概ifelse语句。

  • 缺点
  一个哀求极有大概到了链的末了都得不到处置惩罚,大概由于没有正确设置而得不到处置惩罚。这就很糟糕啦,须要事先思量全面。
  在对于比较长的职责链,哀求处置惩罚大概涉及多个处置惩罚对象,体系性能将会受到肯定影响。
  职责链创建公道性要靠客户端来包管,增长了客户端的复杂性,大概会由于责任链的错误设置导致体系堕落,如大概会造成循环调用。
  在盘算机软硬件中也有相干例子,如总线网中数据报传送,每台盘算机根据目标地点是否同自己的地点雷同来决定是否吸取;尚有非常处置惩罚中,处置惩罚步调根据非常的范例决定自己是否处置惩罚该非常;尚有 Struts2 的拦截器、JSP 和 Servlet 的 Filter 等,全部这些,假如用责任链模式都能很好办理。
8.png   假设小明想请1天假期的故事

  • 领导抽象类
public abstract  class Leader {     private Leader next;     public void setNext(Leader next)     {         this.next=next;     }     public Leader getNext()    {         return next;    }    //处置惩罚哀求的方法   public abstract void handleRequest(int LeaveDays);}

  • 部分负责人实现类
  public class DepartmentsLeade extends  Leader {  @Override  public void handleRequest(int leaveDays) {      if (leaveDays <=2) {         System.out.println("部分领导允许您请假" + leaveDays + "天。");      } else {          if(null != getNext()) {             getNext().handleRequest(leaveDays);          } else {            System.out.println("请假天数太多,没有人允许该假条!");         }     }  }}

  • 副司理实现类
public class DeputyManagerLeader extends  Leader {  @Override  public void handleRequest(int leaveDays) {       if (leaveDays <=4) {            System.out.println("副司理领导允许您请假" + leaveDays + "天。");       } else {       if (getNext() != null) {          getNext().handleRequest(leaveDays);       } else {          System.out.println("请假天数太多,没有人允许该假条!");       }       } }}public class ManagerLeader extends  Leader {    @Override    public void handleRequest(int leaveDays) {        if (leaveDays <=6) {            System.out.println("司理领导允许您请假" + leaveDays + "天。");         } else {              if(null != getNext()) {                 getNext().handleRequest(leaveDays);              } else {                 System.out.println("请假天数太多,没有人允许该假条!");              }         }    }}

  • 测试类
public class Test {public static void main(String[] args) {    Leader leader1 = new DepartmentsLeade();    Leader leader2 = new DeputyManagerLeader();    Leader leader3 = new ManagerLeader();    leader1.setNext(leader2);    leader2.setNext(leader3);    leader1.handleRequest(1);}}

  • 测试结果
部分领导允许您请假1天。  小明末了乐成请了一天假期,看来计划模式无处不在呀。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:50, Processed in 0.133836 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表