1. 概念
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2. 创建Handler抽象类对象
/**
* @author zlc
* @created 2017/12/24
* 管理者类 处理请求
*/
public abstract class Manager {
protected String name;
//管理者上级
protected Manager superior;
public Manager(String name){
this.name = name;
}
public void setSuperior(Manager superior) {
this.superior = superior;
}
public abstract void doRequest(Request request);
}
3. 创建具体的Handler对象 继承抽象类对象
1.普通经理类
/**
* @author zlc
* @created 2017/12/24
* 经理
*/
public class CommonManager extends Manager{
public CommonManager(String name) {
super(name);
}
@Override
public void doRequest(Request request) {
if(request.getRequestType().equals("请假") && request.getNumber() <= 3){
System.out.println(name+" : "+request.getRequestContent()+ "数量 "+ request.getNumber()+" 天,批准了");
}else if(superior != null){
superior.doRequest(request);
}
}
}
2.总监类
/**
* @author zlc
* @created 2017/12/24
* 总监
*/
public class Majordomo extends Manager{
public Majordomo(String name) {
super(name);
}
@Override
public void doRequest(Request request) {
if(request.getRequestType().equals("请假") && request.getNumber() <= 7){
System.out.println(name+" : "+request.getRequestContent()+ "数量 "+ request.getNumber()+" 天,批准了");
}else if(superior != null){
superior.doRequest(request);
}
}
}
3. 总经理类
/**
* @author zlc
* @created 2017/12/24
* 总经理
*/
public class GeneralManager extends Manager{
public GeneralManager(String name) {
super(name);
}
@Override
public void doRequest(Request request) {
if(request.getRequestType().equals("请假")){
System.out.println(name+" : "+request.getRequestContent()+ "数量 "+ request.getNumber()+" 天,批准了");
}else if(request.getRequestType().equals("加薪") ) {
if (request.getNumber() <= 500) {
System.out.println(name + " : " + request.getRequestContent() + "数量 " + request.getNumber() + ",批准了");
} else {
System.out.println(name + " : " + request.getRequestContent() + "数量 " + request.getNumber() + ",再说吧");
}
}
}
}
4.创建一个请求类
/**
* @author zlc
* @created 2017/12/24
*/
public class Request {
private String requestType;
private String requestContent;
private int number;
public void setNumber(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getRequestType() {
return requestType;
}
public void setRequestContent(String requestContent) {
this.requestContent = requestContent;
}
public String getRequestContent() {
return requestContent;
}
}
5. 测试类
@org.junit.Test
public void test(){
Manager cc = new CommonManager("cc");
Manager yjy = new Majordomo("yjy");
Manager zlc = new GeneralManager("zlc");
cc.setSuperior(yjy);
yjy.setSuperior(zlc);
Request request1 = new Request();
request1.setRequestType("请假");
request1.setRequestContent("小菜请假");
request1.setNumber(3);
cc.doRequest(request1);
Request request2 = new Request();
request2.setRequestType("请假");
request2.setRequestContent("小菜请假");
request2.setNumber(5);
cc.doRequest(request2);
Request request3 = new Request();
request3.setRequestType("加薪");
request3.setRequestContent("小菜请求加薪");
request3.setNumber(1000);
cc.doRequest(request3);
}
6.小结
当客户提交一个请求时,请求时沿链传递直至有一个具体对象负责处理它,
责任链可以简化对象的互相连接,它们仅仅需要保持一个指向后继者的引用,
而不需要保持它所有的候选接受者的引用。