设计模式—责任链模式
定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
代码
定义级别来区分请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public enum Level {
LEVELONE(1), LEVELTWO(2), LEVELTHREE(3);
private int level;
Level(int level) { this.level = level; }
public static Level getLeve(int index) { for (Level level : Level.values()) { if (level.getLevel() == index) { return level; } } return null; }
public int getLevel() { return level; } }
|
定义请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class Request {
private int level;
private String requestString;
public Request(int level, String requestString) { this.level = level; this.requestString = requestString; }
public int getLevel() { return level; }
public void setLevel(int level) { this.level = level; }
public String getRequestString() { return requestString; }
public void setRequestString(String requestString) { this.requestString = requestString; }
public Level getMyLevel(){ return Level.getLeve(this.level); } }
|
定义响应
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Response {
private String message;
public Response(String message) { this.message = message; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; } }
|
定义处理器,使用了模板方法,关键在处理的时候通过nextHandler传递请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public abstract class MyHandler {
private MyHandler nextHandler;
public final Response handleMassege(Request request){ Response response; if(this.getHandlerLevel() == request.getMyLevel()){ response= this.echo(request); }else{ if(this.nextHandler!=null){ response = this.nextHandler.handleMassege(request); }else{ response=null; } } return response; }
public void setNextHandler(MyHandler nextHandler) { this.nextHandler = nextHandler; }
protected abstract Level getHandlerLevel(); protected abstract Response echo(Request request); }
|
定义不同处理的具体实现
1 2 3 4 5 6 7 8 9 10 11
| public class ConcreteHandler01 extends MyHandler { @Override protected Level getHandlerLevel() { return Level.LEVELONE; }
@Override protected Response echo(Request request) { return new Response(request.getRequestString()+": 一级响应"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| public class ConcreteHandler02 extends MyHandler {
@Override protected Level getHandlerLevel() { return Level.LEVELTWO; }
@Override protected Response echo(Request request) { return new Response(request.getRequestString()+":二级响应"); } }
|
1 2 3 4 5 6 7 8 9 10 11
| public class ConcreteHandler03 extends MyHandler { @Override protected Level getHandlerLevel() { return Level.LEVELTHREE; }
@Override protected Response echo(Request request) { return new Response(request.getRequestString()+":三级响应"); } }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Test public void testMyHandler(){
MyHandler handler1 = new ConcreteHandler01(); MyHandler handler2 = new ConcreteHandler02(); MyHandler handler3 = new ConcreteHandler03(); handler1.setNextHandler(handler2); handler2.setNextHandler(handler3); for (int i = 1; i < 4; i++) { Request request = new Request(i,"去学校"); Response response = handler1.handleMassege(request); System.out.println(response.getMessage()); } }
|