模式定义与设计解读
设计模式晦涩的定义总是难懂,但同时这些定义又有着独特的涵义。本文想通过最直观的例子,把这些晦涩的定义反应在代码层面上。代码是设计模式最直观的表达,当你看不懂定义时,代码会说话。希望这篇解读可以帮助到你。预计阅读10分钟。
定义
责任链模式 :使多个对象有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
注意一下加粗的关键字,解读会重新定义这些难懂的定义。
解读
在生活经常存在一种场景,完成一件事情,需要串行执行几个步骤。比如把大象装冰箱,需要三个步骤。
- 把冰箱门打开
- 把大象装冰箱
- 把冰箱门关上
现在把这件事情抽象成代码,并与上文中的定义对应。
- 请求指把大象装冰箱这件事情,对应一个数据结构
RequestContext
。
/**
* 请求上下文
*/
public class RequestContext {
public Elephant mElephant;//大象
public Refrigerator mRefrigerator;//冰箱
public RequestContext(Elephant elephant, Refrigerator refrigerator) {
mElephant = elephant;
mRefrigerator = refrigerator;
}
public static class Elephant{
}
public static class Refrigerator{
}
}
- 一条链比较好理解,但是比较难抽象。既然做这件事需要串行好几个步骤,链条上自然也是围绕请求展开,既需要有获取请求的方法
RequestContext getContext()
,也需要有执行请求的方法procceed(RequestContext context)
。这个方法有开始执行的意思,也有请求串行传递后继续执行的意思。
proceed 英 [prə'siːd]
vi. 开始;继续进行;发生;
/**
* 请求链
*/
public interface Chain {
/**
* 获取请求实体
*/
RequestContext getContext();
/**
* 开始或继续执行请求。
*/
void proceed(RequestContext context);
}
- 对象指1.2.3操作大象和冰箱的三个步骤,可以把每次步抽象成一个处理请求的对象,万物皆对象。现在我们已经把请求封装在了链条里,那对于每个操作步骤,都直接来处理链条上的请求即可。
/**
* 处理者
*/
public interface Handler {
/**
* 处理链条上的请求
*/
void handle(Chain chain);
}
- 发送者和接收者其