使很多对象都有处理请求的机会从而避免请求的发送者和接受者之间的耦合关系将这些对象连成一条链并沿着这条链传递该请求直到有一个对象处理它为止责任链模式主要包括以下几个角色处理者处理者是一个接口负责规定具体处理者处理用户请求的方法以及具体处理者设置后继处理对象的方法具体处理者具体处理者是实现处理接口的类的实例具体处理者通过调用处理接口规定的方法处理用户的请求既在接到用户的请求后处理者将调用接口规定的方法在执行该方法的过程中如果发现能处理用户的请求就处理用户的请求如果发现处理不了就交给下一个处理者进行处理
例如一个图书检索的程序根据图书类别将图书分为了N个种类然后创建若干个种类的对象每个对象对一个种类进行检索为了能更好的管理这些对象可以将这额对象组织成一个责任链当用户需要鑒定书籍时系统可以让责任链上的第一个对象来处理用户的请求这个对象首先检索自己是否能够处理用户的请求如果能处理就反馈并返回处理内容如果不能处理则交给下一个处理对象进行处理
view plainprint?
package orgzhydesigndemo
/** * 处理接口* @author zhengyi * */ public interface Handler {
//根据书的ID进行检索public abstract void Search(int id)
//下一个处理者 参数为实现处理接口的实现类public abstract void nextHandler(Handler han)}
view plainprint?
package orgzhydesigndemo
import javautilArrayListimport javautilList
/** * 文学类的书籍检索* @author zhengyi * */ public class WenXue implements Handler{
private Handler han//下一个处理者private List<Integer> list //模拟文学类书籍的编号
public WenXue(){ list=new ArrayList<Integer>()listadd()listadd()listadd()listadd()listadd()}
@Override public void nextHandler(Handler han) { thishan=han //给下一个处理者赋值} @Override public void Search(int id) { if(ntains(id)){ //检索list中是否存在此ID的书籍如果存在则打印Systemoutprintln(恭喜您您检索的书籍是文学类的)}else{ //如果没有此书籍则交给下一个处理者进行处理if(han!=null){ hanSearch(id)}
view plainprint?
package orgzhydesigndemo
import javautilArrayListimport javautilList
/** * 计算机类的书籍* @author zhengyi * */ public class JiSuanJi implements Handler {
private Handler hanprivate List<Integer> listpublic JiSuanJi(){ list=new ArrayList<Integer>()listadd()listadd()listadd()listadd()listadd()} @Override public void nextHandler(Handler han) { thishan=han} @Override public void Search(int id) { if(ntains(id)){ Systemoutprintln(恭喜你此书记在计算机类)}else{ if(han!=null){ hanSearch(id)}
view plainprint?
package orgzhydesigndemo
public class Appliction {
private Handler jisuanjiwenxue
public void createHandler(){ jisuanji=new JiSuanJi()wenxue=new WenXue()jisuanjinextHandler(wenxue) //指定下一个处理者}
public void search(int id){ jisuanjiSearch(id) //第一个处理者进行筛选处理}
public static void main(String[] args) { Appliction app=new Appliction()appcreateHandler()appsearch()}
适合使用责任链模式的情况在许多对象可以处理用户请求的时候希望用户不必明确处理者的时候同时向多个处理者发送请求程序希望动态的订制可处理用户请求的集合对象