使很多对象都有处理请求的机会,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
责任链模式主要包括以下几个角色
1、处理者:处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继处理对象的方法
2、具体处理者:具体处理者是实现处理接口的类的实例,具体处理者通过调用处理接口规定的方法处理用户的请求,既在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理用户的请求。如果发现处理不了就交给下一个处理者进行处理。
例如一个图书检索的程序,根据图书类别将图书分为了N个种类,然后创建若干个种类的对象,每个对象对一个种类进行检索。为了能更好的管理这些对象,可以将这额对象组织成一个责任链,当用户需要鉴定书籍时,系统可以让责任链上的第一个对象来处理用户的请求,这个对象首先检索自己是否能够处理用户的请求,如果能处理就反馈并返回处理内容。如果不能处理则交给下一个处理对象进行处理。
package designmodel.chainofresponsibility;
/**
* 处理接口
*
*/
public interface Handler {
//根据书的ID进行检索
public abstract void Search(int id);
//下一个处理者 参数为实现处理接口的实现类
public abstract void nextHandler(Handler handler);
}
package designmodel.chainofresponsibility;
import java.util.ArrayList;
import java.util.List;
/**
* 文学类的书籍检索
*
*/
public class WenXue implements Handler {
private Handler handler;
private List<Integer> list;
public WenXue(){
list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
}
public void Search(int id) {
if(list.contains(id)) {
System.out.println("恭喜您,您检索的书籍是文学类的");
} else {
if(handler != null) {
handler.Search(id);
}
}
}
public void nextHandler(Handler handler) {
this.handler = handler;
}
}
package designmodel.chainofresponsibility;
import java.util.ArrayList;
import java.util.List;
/**
* 计算机类的书籍
*
*/
public class JiSuanJi implements Handler {
private Handler handler;
private List<Integer> list;
public JiSuanJi(){
list=new ArrayList<Integer>();
list.add(6);
list.add(7);
list.add(8);
list.add(9);
list.add(10);
}
public void Search(int id) {
if(list.contains(id)){
System.out.println("恭喜你,此书记在计算机类");
}else{
if(handler!=null){
handler.Search(id);
}
}
}
public void nextHandler(Handler handler) {
this.handler = handler;
}
}
package designmodel.chainofresponsibility;
public class Test {
private Handler jisuanji,wenxue;
public void createHandler() {
jisuanji=new JiSuanJi();
wenxue=new WenXue();
jisuanji.nextHandler(wenxue); //指定下一个处理者
}
public void search(int id){
jisuanji.Search(id); //第一个处理者进行筛选处理
}
public static void main(String[] args) {
Test test = new Test();
test.createHandler();
test.search(10);
}
}
适合使用责任链模式的情况
1、在许多对象可以处理用户请求的时候
2、希望用户不必明确处理者的时候,同时向多个处理者发送请求
3、程序希望动态的订制可处理用户请求的集合对象