职责链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
责任链模式通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。
责任链模式允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
类图示例

举个例子
申请加薪
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| class Request{ private String requestType;
public String getRequestType() { return requestType; }
public void setRequestType(String requestType) { this.requestType = requestType; } private String requestContent; public String getRequestContent() { return requestContent; } public void setRequestContent(String requestContent) { this.requestContent = requestContent; } private int numberOfRequests; public int getNumberOfRequests() { return numberOfRequests; } public void setNumberOfRequests(int numberOfRequests) { this.numberOfRequests = numberOfRequests; } }
abstract class Manager{ protected String name; protected Manager superior; public Manager(String name){ this.name = name; } public void SetSuperior(Manager superior){ this.superior = superior; } abstract void RequestApplications(Request request); }
class CommonManager extends Manager{ public CommonManager(String name){ super(name); } public void RequestApplications(Request request){ if(request.getRequestType() == "请假"&&request.getNumberOfRequests() < 2){ System.out.println(name+" "+request.getRequestContent()+" "+request.getNumberOfRequests()+"被批准"); }else{ if (superior != null){ superior.RequestApplications(request); } } } }
class MajordomoManager extends Manager{ public MajordomoManager(String name){ super(name); } public void RequestApplications(Request request){ if(request.getRequestType() == "请假"&&request.getNumberOfRequests() < 5){ System.out.println(name+" "+request.getRequestContent()+" "+request.getNumberOfRequests()+"被批准"); }else{ if (superior != null){ superior.RequestApplications(request); } } } }
class GeneralManager extends Manager{ public GeneralManager(String name){ super(name); } public void RequestApplications(Request request){ if(request.getRequestType()=="请假"){ System.out.println(name+" "+request.getRequestContent()+" "+request.getNumberOfRequests()+"被批准"); }else if(request.getRequestType()=="加薪"&&request.getNumberOfRequests() <= 500){ System.out.println(name+" "+request.getRequestContent()+" "+request.getNumberOfRequests()+"被批准"); }else if(request.getRequestType()=="加薪"&&request.getNumberOfRequests() > 500){ System.out.println(name+" "+request.getRequestContent()+" "+request.getNumberOfRequests()+"再说吧"); } } }
public class ChainOfDuty { public static void main(String[] args) { CommonManager jinli=new CommonManager("金利"); MajordomoManager zongjian = new MajordomoManager("宗剑"); GeneralManager zongjingli = new GeneralManager("钟精力"); jinli.SetSuperior(zongjian); zongjian.SetSuperior(zongjingli);
Request request=new Request(); request.setRequestType("请假"); request.setRequestContent("zhang3请假"); request.setNumberOfRequests(1); jinli.RequestApplications(request);
Request request2=new Request(); request2.setRequestType("请假"); request2.setRequestContent("zhang3请假"); request2.setNumberOfRequests(4); jinli.RequestApplications(request2);
Request request3=new Request(); request3.setRequestType("加薪"); request3.setRequestContent("zhang3加薪"); request3.setNumberOfRequests(500); jinli.RequestApplications(request3);
Request request4=new Request(); request4.setRequestType("加薪"); request4.setRequestContent("zhang3加薪"); request4.setNumberOfRequests(1000); jinli.RequestApplications(request4); } }
|
类图

职责链模式包含如下角色
- Handler接口:定义一个方法用于处理请求。
- ConcreteHandler类:实现Handler接口,包含请求处理逻辑和对下一个处理者的引用。
模式分析
- 优点
- 降低耦合度:发送者和接收者之间解耦。
- 简化对象:对象不需要知道链的结构。
- 灵活性:通过改变链的成员或顺序,动态地新增或删除责任。
- 易于扩展:增加新的请求处理类很方便。
- 缺点
- 请求未被处理:不能保证请求一定会被链中的某个处理者接收。
- 性能影响:可能影响系统性能,且调试困难,可能导致循环调用。
- 难以观察:运行时特征不明显,可能妨碍除错。