什么是职责链模式呢?
使多个对象都有机会处理请求,从而避免发送者和接收者之间的耦合关系。将这个对象连成一个链,并沿着这条链传递该请求,直到有一个对象处理它为止。
好处是它可以简化对象的相互链接,他们公需要保存一个指向其后继者的引用,而不需要保存所有的候选接受者的引用,降低了耦合程度。同时还可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。不过它也有不好的一面,那就是一个请求极有可能 到了链的末端都到不到处理,或者因为没有正确配置而得不到处理。
下面是该设计模式的逻辑代码:
1 抽象类或者基本类
1.1 Manager.java
package com.ops.responsibility;
public abstract class Manager {
protected String name = null;
protected Manager superior = null;
public Manager(String name) {
this.name = name;
}
public void setSuperior(Manager superior) {
this.superior = superior;
}
abstract public void handleRequest(Request request);
}
1.2 Request.java
package com.ops.responsibility;
public class Request {
private String content = null;
private int number = -1;
private String type = null;
public Request() {
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
2 实现类
2.1 CommonManager.java
package com.ops.responsibility.base;
import com.ops.responsibility.Manager;
import com.ops.responsibility.Request;
/**
* 经理类
* @author Administrator
*
*/
public class CommonManager extends Manager {
public CommonManager(String name) {
super(name);
}
@Override
public void handleRequest(Request request) {
if ("LEAVE".equalsIgnoreCase(request.getType()) && 2 >= request.getNumber()) {
System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
} else {
if (null != superior) {
superior.handleRequest(request);
}
}
}
}
2.2 Majordomo.java
package com.ops.responsibility.base;
import com.ops.responsibility.Manager;
import com.ops.responsibility.Request;
/**
* 总监
* @author Administrator
*
*/
public class Majordomo extends Manager {
public Majordomo(String name) {
super(name);
}
@Override
public void handleRequest(Request request) {
if ("LEAVE".equalsIgnoreCase(request.getType()) && 5 >= request.getNumber()) {
System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
} else {
if (null != superior) {
superior.handleRequest(request);
}
}
}
}
2.3 GeneralManager.java
package com.ops.responsibility.base;
import com.ops.responsibility.Manager;
import com.ops.responsibility.Request;
/**
* 总经理
* @author Administrator
*
*/
public class GeneralManager extends Manager {
public GeneralManager(String name) {
super(name);
}
@Override
public void handleRequest(Request request) {
if ("LEAVE".equalsIgnoreCase(request.getType())) {
if (5 >= request.getNumber()) {
System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
} if (5 < request.getNumber()) {
System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 小子,你不能请这么多天的喔!!!");
}
} else if ("SALARY_INCREASE".equalsIgnoreCase(request.getType())){
if (500 >= request.getNumber()) {
System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
} else if (500 < request.getNumber()) {
System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 好好加油,以后再说吧!!!");
}
}
}
}
3 客户端调用类
ResponsibilityClient.java
package com.ops.responsibility.main;
import org.junit.Test;
import com.ops.responsibility.Request;
import com.ops.responsibility.base.CommonManager;
import com.ops.responsibility.base.GeneralManager;
import com.ops.responsibility.base.Majordomo;
public class ResponsibilityClient {
@Test
public void test() {
CommonManager jinli = new CommonManager("经理");
Majordomo zongjian = new Majordomo("总监");
GeneralManager zongjingli = new GeneralManager("总经理");
jinli.setSuperior(zongjian);
zongjian.setSuperior(zongjingli);
Request request = new Request();
request.setType("LEAVE");
request.setContent("我要请假");
request.setNumber(2);
jinli.handleRequest(request);
Request request2 = new Request();
request2.setType("LEAVE");
request2.setContent("我还是要请假");
request2.setNumber(4);
jinli.handleRequest(request2);
Request request3 = new Request();
request3.setType("SALARY_INCREASE");
request3.setContent("我要钱多多");
request3.setNumber(200);
jinli.handleRequest(request3);
Request request4 = new Request();
request4.setType("SALARY_INCREASE");
request4.setContent("我要钱更多多");
request4.setNumber(600);
jinli.handleRequest(request4);
}
}