设计模式学习笔记(六:责任链模式)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计模式学习笔记(六:责任链模式)
1.1概述
使多个对象都有机会处理请求,从⽽避免请求的发送者和接收者之间的耦合关系。
将这些对象连成⼀条链,并沿着这条链传递该请求,直到有⼀个对象处理它为⽌。
这就是责任链模式。
责任链模式是使⽤多个对象处理⽤户请求的成熟模式,责任链模式的关键是将⽤户的请求分派给许多对象,这些对象被组织成⼀个责任链,即每个对象含有后继对象的引⽤,并要求责任链上的每个对象,如果能处理⽤户的请求,就做出处理,不再将⽤户的请求传递给责任链上的下⼀个对象;如果不能处理⽤户的请求,就必须将⽤户的请求传递给责任链上的下⼀个对象。
1.2模式的结构
责任链模式的结构总包括两种⾓⾊:
(1)处理者(Handler):处理者是⼀个接⼝,负责规定具体处理者处理⽤户请求的⽅法,以及具体处理者设置后继对象的⽅法。
(2)具体处理者(ConcreteHandler):具体处理者是实现处理者接⼝的类的实例。
具体处理者通过调⽤处理者接⼝规定的⽅法处理⽤户的请求,即在接到⽤户的请求后,处理者将调⽤接⼝规定的⽅法,在执⾏该⽅法的过程中,如果发现能处理⽤户的请求,就处理有关数据,否则就反馈⽆法处理的信息给⽤户,然后将⽤户的请求传递给⾃⼰的后继对象。
责任链模式结构的类图如下所⽰:
1.3责任链模式的优点
(1)责任链中的对象只和⾃⼰的后继是低耦合关系,和其他对象毫⽆关联,这使得编写处理者对象以及创建责任链变得⾮常容易。
(2)当在处理者中分配职责时,责任链给应⽤程序更多的灵活性。
(3)应⽤程序可以动态地增加、删除处理者或重新指派处理者的职责。
(4)
应⽤程序可以动态地增加、删除处理者或重新指派处理者的职责。
(5)应⽤程序可以动态地改变处理者之间的先后顺序。
(6)使⽤责任链的⽤户不必知道处理者的信息,⽤户不会知道到底是哪个对象处理了它的请求。
1.4适合使⽤责任链模式的情景
(1)有许多对象可以处理⽤户的请求,希望程序在运⾏期间⾃动确定处理⽤户的那个对象。
(2)希望⽤户不必明确指定接受者的情况下,向多个接受者的⼀个提交请求。
(3)程序希望动态制定可处理⽤户请求的对象集合。
1.5责任链模式的使⽤
以下通过⼀个简单的问题来描述责任链模式汇总所涉及的各个⾓⾊。
⽤户提交⼀个个⼈⾝份证号码,想知道该⼈是否在北京、上海或天津居住。
针对上述问题,使⽤责任链模式设计⼀个系统来处理⽤户的请求。
具体如下:
⾸先看⼀下本实例构建框架具体类和1.2模式的结构中类图的对应关系,如下图所⽰:
(1)处理者(Handler)
本问题中,处理者(Handler)接⼝的名字是Handler,代码如下:
package com.liuzhen.six_chainOfResponsibility;
public interface Handler {
public abstract void handleRequest(String number);
public abstract void setNextHandler(Handler handler);
}
(2)具体处理者
对于本问题,⼀共有三个负责创建具体处理者的类,分别是Beijing、Shanghai和Tianjing,三个类的代码如下:Beijing.java类:
package com.liuzhen.six_chainOfResponsibility;
import java.util.ArrayList;
public class Beijing implements Handler{
private Handler handler; //存放当前处理者后继的Handler接⼝变量
private ArrayList<String> numberList; //存放⾝份证号码的数组线性表
Beijing(){
numberList = new ArrayList<String>();
numberList.add("123456789"); //这⾥使⽤模拟的⾝份证号码
numberList.add("987654321");
numberList.add("987212143");
numberList.add("767734672");
}
public void handleRequest(String number){
if(numberList.contains(number))
System.out.println("该⼈在北京居住");
else{
System.out.println("该⼈不在北京居住");
if(handler != null)
handler.handleRequest(number); //将请求传递给下⼀个处理者
}
}
public void setNextHandler(Handler handler){
this.handler = handler;
}
}
Shanghai.java类:
package com.liuzhen.six_chainOfResponsibility;
import java.util.ArrayList;
public class Shanghai implements Handler{
private Handler handler; //存放当前处理者后继的Handler接⼝变量
private ArrayList<String> numberList; //存放⾝份证号码的数组线性表
Shanghai(){
numberList = new ArrayList<String>();
numberList.add("234567891"); //这⾥使⽤模拟的⾝份证号码
numberList.add("876543219");
numberList.add("872121493");
numberList.add("767734729");
}
public void handleRequest(String number){
if(numberList.contains(number))
System.out.println("该⼈在上海居住");
else{
System.out.println("该⼈不在上海居住");
if(handler != null)
handler.handleRequest(number); //将请求传递给下⼀个处理者
}
}
public void setNextHandler(Handler handler){
this.handler = handler;
}
}
Tianjing.java类:
package com.liuzhen.six_chainOfResponsibility;
import java.util.ArrayList;
public class Tianjing implements Handler{
private Handler handler; //存放当前处理者后继的Handler接⼝变量
private ArrayList<String> numberList; //存放⾝份证号码的数组线性表
Tianjing(){
numberList = new ArrayList<String>();
numberList.add("345678912"); //这⾥使⽤模拟的⾝份证号码
numberList.add("886543219");
numberList.add("972121493");
numberList.add("667734729");
}
public void handleRequest(String number){
if(numberList.contains(number))
System.out.println("该⼈在天津居住");
else{
System.out.println("该⼈不在天津居住");
if(handler != null)
handler.handleRequest(number); //将请求传递给下⼀个处理者
}
}
public void setNextHandler(Handler handler){
this.handler = handler;
}
}
(3)具体使⽤
通过SixApllication类来具体实现上述相关类和接⼝,来实现适配器模式的运⽤,其代码如下:package com.liuzhen.six_chainOfResponsibility;
public class SixApplication {
private Handler beijing,shanghai,tianjing; //责任链上的对象
public void createChain(){ //建⽴责任链
beijing = new Beijing();
shanghai = new Shanghai();
tianjing = new Tianjing();
beijing.setNextHandler(shanghai);
shanghai.setNextHandler(tianjing);
}
public void reponseClient(String number){ //响应⽤户的请求
beijing.handleRequest(number);
}
public static void main(String args[]){
SixApplication sixApplicaiton = new SixApplication();
sixApplicaiton.createChain();
sixApplicaiton.reponseClient("667734729");
}
}
运⾏结果:
该⼈不在北京居住
该⼈不在上海居住
该⼈在天津居住
参考资料:
1.Java设计模式/耿祥义,张跃平著.——北京:清华⼤学出版社,2009.5。