java职责链模式

职责链模式:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。通俗一点说就是,当客户提交一个请求时,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不知道哪一个对象将会处理它。当然职责链中也可能没有可以处理该请求的对象,这种情况是允许发生的。

在以下条件下可考虑使用Chain of Responsibility:
1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2 你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3 可处理一个请求的对象集合应该被动态指定。

package chainofresponsibility; public class Request { public String getRequestType() { return requestType; } public void setRequestType(String requestType) { this.requestType = requestType; } public String getRequestContetn() { return requestContetn; } public void setRequestContetn(String requestContetn) { this.requestContetn = requestContetn; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } private String requestType; private String requestContetn; private int number; }

abstract class Manager { protected String name; protected Manager superior; protected Manager(String name){ this.name = name; } //设置管理者上级 public void setSuperior(Manager superior) { this.superior = superior; } //申请请求 abstract public void RequestApplications(Request request); }

public class CommonManager extends Manager{ protected CommonManager(String name) { super(name); } @Override public void RequestApplications (Request request) { if(request.getRequestType() == "请假" && request.getNumber() <= 2) { System.out.println("经理批准请假<=2天"); }else { if(superior != null) { superior.RequestApplications(request); } } } }

public class Majordomo extends Manager{ protected Majordomo(String name) { super(name); } @Override public void RequestApplications(Request request) { if(request.getRequestType()=="请假" && request.getNumber() <= 5) { System.out.println("总监批准请假<=5天"); }else { if(superior != null) { superior.RequestApplications(request); } } } }

public class GeneralManager extends Manager{ protected GeneralManager(String name) { super(name); } @Override public void RequestApplications(Request request) { if(request.getRequestType() == "请假" ){ System.out.println("总经理批准请假任意天"); }else if(request.getRequestType() == "加薪" && request.getNumber() <= 500) { System.out.println("总经理批准加薪数量 <=500"); }else if(request.getRequestType() == "加薪" && request.getNumber() > 500) { System.out.println("总经理不批准加薪数量 >500"); } } }

public class TestChainOfResponsibility { public static void main(String[] args) { CommonManager jinli = new CommonManager("廖经理"); Majordomo zongjian = new Majordomo("严总监"); GeneralManager zhongjinli = new GeneralManager("杨总经理"); jinli.setSuperior(zongjian); zongjian.setSuperior(zhongjinli); Request request = new Request(); request.setRequestType("请假"); request.setRequestContetn("小菜请假"); request.setNumber(1); jinli.RequestApplications(request); Request request2 = new Request(); request2.setRequestType("请假"); request2.setRequestContetn("小菜请假"); request2.setNumber(4); jinli.RequestApplications(request2); Request request3 = new Request(); request3.setRequestType("加薪"); request3.setRequestContetn("小菜申请加薪"); request3.setNumber(500); jinli.RequestApplications(request3); Request request4 = new Request(); request4.setRequestType("加薪"); request4.setRequestContetn("小菜申请加薪"); request4.setNumber(1000); jinli.RequestApplications(request4); } }

java职责链模式