您的位置:首页 > 编程语言 > Java开发

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

2016-04-03 23:22 495 查看
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式。

主要场景:

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

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

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

类图如下



下面为具体代码实现:

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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: