From 4e57c4e03422b02af5518c34abd13b3845e2d81c Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 5 Jun 2018 10:40:38 +0800 Subject: [PATCH] auto commit --- notes/设计模式.md | 104 +++++++++++++++++- pics/691f11eb-31a7-46be-9de1-61f433c4b3c7.png | Bin 0 -> 13312 bytes 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 pics/691f11eb-31a7-46be-9de1-61f433c4b3c7.png 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 0000000000000000000000000000000000000000..b61e2174cd898e6b217154604049a7e4c37944e1 GIT binary patch literal 13312 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