职责链模式顾名思义是一个链条,在这个链条上的所有节点都可以处理请求,但是在某一种情况下,哪一个节点来处理这个请求是运行时决定的,但是客户端不需要知道具体是谁来处理,他只需要将请求交给一个节点就行了,当这个节点可以处理时,它就处理并返回给客户端,当它不能处理时,将这个请求传给职责链上的下一个节点,依次下去,直到请求被处理或者达到链条的最后一个节点。
例如,当我向我的上级经理要提出请半天假的时候,这种事情他批准就行了,它可以直接给我回复;当我要请一个星期假的时候,他就没权力批准了,因此他向他的经理转交这个请求,他的经理同意之后给我回复;如果我提出要加薪的时候,我的经理和我的经理的经理也搞不定,他只有再向上一层回报,也就是总经理,总经理拿到这个请求之后会判断同意或者不同意,然后给我回复。这就是职责链,下面的代码就是模拟这个情况。
package chainOfResponsebility;
class Request {
private String name;
private String requestType;
private int number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
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 public void requestApplications(Request requset);
}
//总经理
class GeneralManager extends Manager {
public GeneralManager(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
if(request.getRequestType().equals("请假")&&request.getNumber()<=7){
System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",GeneralManager,"+this.name);
}else if(request.getRequestType().equals("加薪")&&request.getNumber()<=800){
System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",GeneralManager,"+this.name);
}
else{
System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"不批准"+",GeneralManager,"+this.name);
}
}
}
//总监
class Majordomo extends Manager {
public Majordomo(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
if(request.getRequestType().equals("请假")&&request.getNumber() <=5){
System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",Majordomo,"+this.name);
}else{
if(this.superior!=null){
this.superior.requestApplications(request);
}
}
}
}
//经理
class CommonManager extends Manager {
public CommonManager(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
if(request.getRequestType().equals("请假")&& request.getNumber()<=2){
System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",CommonManager,"+this.name);
}else{
if(this.superior!=null){
this.superior.requestApplications(request);
}
}
}
}
public class Test{
public static void main(String[]args){
CommonManager commonManager =new CommonManager("Tom");
Majordomo majordomo =new Majordomo("Jerry");
GeneralManager generalManager =new GeneralManager("Thomas");
//设置上下级
commonManager.SetSuperior(majordomo);
majordomo.SetSuperior(generalManager);
Request request = new Request();
request.setName("Vincent");
request.setRequestType("请假");
request.setNumber(1);
commonManager.requestApplications(request);
}
}