设计模式之职责链模式(JAVA实现)

时间:2023-03-09 22:51:41
设计模式之职责链模式(JAVA实现)

学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式。

主要场景:

小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意。

职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理。依次类推

这里将处理对象抽象为Handler类,经理、总监等为继承Handler的具体处理类,同时模拟客户端Client向Handler对象发出请求

类图如下

设计模式之职责链模式(JAVA实现)

下面为具体代码实现:

Handler.java

 /**
* 抽象的处理类
* @author GXF
*
*/
public abstract class Handler {
public Handler successor; //后继者,或权限更高的对象
public abstract void handleRequest(int request); //处理客户端请求 public void setSuccesor(Handler successor){ //设置后继者,或者更高权限的对象
this.successor = successor;
} }

ConcreteHandler1.java

 /**
* 具体处理类1
* 处理请求范围在1~10之间的请求
* @author GXF
*
*/
public class ConcreteHandler1 extends Handler { @Override
public void handleRequest(int request) {
if(request >=0 && request <= 10){ //在自己的权限范围内,自己处理
System.out.println("ConcreteHandler1 handle request = " + request);
}
else if(successor != null){ //超过自己的权限,如果有更高权限对象,交由其处理
successor.handleRequest(request);
} } }

ConcreteHandler2.java

 /**
* 具体处理类
* 处理reqeuest 10~20范围
* @author GXF
*
*/
public class ConcreteHandler2 extends Handler { @Override
public void handleRequest(int request) {
if(request > 10 && request <= 20){ //处理权限范围内的请求
System.out.println("ConcreteHandler2 handle request = " + request);
}
else if(successor != null){ //不能处理的请求,交由权限更高的处理对象处理
successor.handleRequest(request);
}
} }

ConcreteHandler3.java

 /**
* 具体处理类3
* 处理request范围:20~30
* @author GXF
*
*/
public class ConcreteHandler3 extends Handler { @Override
public void handleRequest(int request) {
if(request > 20 && request <= 30){
System.out.println("ConcreteHandler3 handle request = " + request);
}
else if(successor != null){
successor.handleRequest(request);
} } }

Client.java

 /**
* 职责链模式客户端
* @author GXF
*
*/
public class Client { public static void main(String args[]){
//生成三个权限的处理者对象
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3(); //设置职责链后继者
h1.setSuccesor(h2);
h2.setSuccesor(h3); //生成1-30的数字,作为请求,交由handler处理
int requests[] = new int[30]; //初始化reqeusts数组
for(int i = 0; i < requests.length; i++){
requests[i] = i;
} for(int i = 0 ; i < requests.length; i++){
h1.handleRequest(requests[i]);
}//for } }