小明是一家公司的员工,因来日诰日有事,须要举行请假,可批假的领导有部分负责人、副总司理、总司理等。请2天以下部分负责人可以直接处置惩罚,假如请4天以下的副总司理可以处置惩罚,请6天以下就须要总司理处置惩罚。这也是一个计划模式的表现,那就是责任链模式。
责任链模式(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 等,全部这些,假如用责任链模式都能很好办理。
假设小明想请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天。 小明末了乐成请了一天假期,看来计划模式无处不在呀。 |