diff --git a/notes/设计模式.md b/notes/设计模式.md index af6cf903..6c29e7e9 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -584,7 +584,109 @@ abc ### 意图 -避免将请求的发送者附加到其接收者,从而使其它对象也可以处理请求;将请求以对象的方式发送到链上直到请求被处理完毕。 +使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 + +### 类图 + +- Handler:定义处理请求的接口,并且实现后继链(successor) + +

+ +### 实现 + +```java +public abstract class Handler { + protected Handler successor; + + public Handler(Handler successor) { + this.successor = successor; + } + + protected abstract void handleRequest(Request request); +} +``` + +```java +public class ConcreteHandler1 extends Handler { + public ConcreteHandler1(Handler successor) { + super(successor); + } + + @Override + protected void handleRequest(Request request) { + if (request.getType() == RequestType.type1) { + System.out.println(request.getName() + " is handle by ConcreteHandler1"); + return; + } + if (successor != null) { + successor.handleRequest(request); + } + } +} +``` + +```java +public class ConcreteHandler2 extends Handler{ + public ConcreteHandler2(Handler successor) { + super(successor); + } + + @Override + protected void handleRequest(Request request) { + if (request.getType() == RequestType.type2) { + System.out.println(request.getName() + " is handle by ConcreteHandler2"); + return; + } + if (successor != null) { + successor.handleRequest(request); + } + } +} +``` + +```java +public class Request { + private RequestType type; + private String name; + + public Request(RequestType type, String name) { + this.type = type; + this.name = name; + } + + public RequestType getType() { + return type; + } + + public String getName() { + return name; + } +} +``` + +```java +public enum RequestType { + type1, type2 +} +``` + +```java +public class Client { + public static void main(String[] args) { + Handler handler1 = new ConcreteHandler1(null); + Handler handler2 = new ConcreteHandler2(handler1); + Request request1 = new Request(RequestType.type1, "request1"); + handler2.handleRequest(request1); + Request request2 = new Request(RequestType.type2, "request2"); + handler2.handleRequest(request2); + } +} +``` + +```html +request1 is handle by ConcreteHandler1 +request2 is handle by ConcreteHandler2 +``` ### JDK diff --git a/pics/691f11eb-31a7-46be-9de1-61f433c4b3c7.png b/pics/691f11eb-31a7-46be-9de1-61f433c4b3c7.png new file mode 100644 index 00000000..b61e2174 Binary files /dev/null and b/pics/691f11eb-31a7-46be-9de1-61f433c4b3c7.png differ