package com;
public class Test {
/**
* 职责链模式的结构优化
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建请求对象
Request request = new Request();
//创建具体处理者A
ConcreateHandlerA ca = new ConcreateHandlerA();
//创建具体处理者B
ConcreateHandlerB cb = new ConcreateHandlerB();
//创建最终处理者
FinalHandler fh = new FinalHandler();
//添加职责链
ca.addHandler(cb);
cb.addHandler(fh);
//通过职责链处理请求
ca.sendToHandler(request);
}
}
运行结果:
Processing first step
Processing second step
Processing final step
package com;
public class Request {
//声明状态的变量
public String status = "initial";
//设置状态变量的方法
public void setStatus(String status){
this.status =status;
}
//获取状态变方法
public String getStatus() {
return status;
}
//处理相应的操作
public void execute (String operation){
System.out.println("Processing "+operation);
}
}
package com;
public interface Handler {
//添加处理者方法
public void addHandler(Handler handler);
//发送请求对象到下一个处理者
public void sendToHandler(Request request);
//获取下一个处理者
public Handler getHandler();
}
package com;
public class ConcreateHandlerA implements Handler {
//声明下一个处理者
Handler nextHandler = null;
//构造器
public ConcreateHandlerA(){
}
//添加处理者方法
@Override
public void addHandler(Handler handler) {
nextHandler = handler;
}
//获取下一个处理者
@Override
public Handler getHandler() {
return nextHandler;
}
//发送请求对象到下一个处理者
@Override
public void sendToHandler(Request request) {
if(request.getStatus().equalsIgnoreCase("initial")){
//对请求对象做相应的处理操作
request.execute("first step");
//为请求对象设置新的状态
request.status = "first step finished";
if(nextHandler != null){
nextHandler.sendToHandler(request);
}
//如果不属于自己的职责就传递给下一个处理者
}else if(nextHandler != null){
nextHandler.sendToHandler(request);
}
}
}
package com;
public class ConcreateHandlerB implements Handler {
Handler nextHandler = null;
public ConcreateHandlerB (){
}
@Override
public void addHandler(Handler handler) {
nextHandler = handler;
}
@Override
public Handler getHandler() {
return nextHandler;
}
@Override
public void sendToHandler(Request request) {
if(request.getStatus().equalsIgnoreCase("first step finished")){
request.execute("second step");
request.status = "second step finished";
if(nextHandler!=null){
nextHandler.sendToHandler(request);
}
}else if(nextHandler!=null){
nextHandler.sendToHandler(request);
}
}
}
package com;
public class FinalHandler implements Handler {
Handler nextHandler = null;
public FinalHandler(){
}
@Override
public void addHandler(Handler handler) {
nextHandler = handler;
}
@Override
public Handler getHandler() {
return nextHandler;
}
@Override
public void sendToHandler(Request request) {
if(request.getStatus().equalsIgnoreCase("second step finished")){
request.execute("final step");
request.status = "final step finished";
if(nextHandler !=null){
nextHandler.sendToHandler(request);
}
}else if(nextHandler !=null){
nextHandler.sendToHandler(request);
}
}
}