责任链模式

责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

概述

使用多个对象处理用户请求,这些对象组织成一条责任链A-B-C-D。收到用户请求时,A先接收到用户请求,根据需要处理,这时可以直接响应用户,也可以把用户请求分派给下一个对象B。因此每个对象都含有后继对象的引用。

模式的结构

处理者(Handler):一个接口,规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法。

具体处理者:实现处理者接口的类的实例,处理用户请求并决定是否将用户请求交给后继对象处理。

模式的使用

用户提交一个人的身份证号码,想知道该人是否在北京、上海或天津居住。

处理者:Handler.java

/**
 * 处理者
 */
public interface Handler {
    void handleRequest(String number);
    void setNextHandler(Handler handler);
}

具体处理者1:Beijing.java

import java.util.ArrayList;

/**
 * Beijing
 */
public class Beijing implements Handler{
    private Handler handler;
    private ArrayList<String> numList;
    Beijing(){
        numList = new ArrayList<String>();
        numList.add("432189571389351");
        numList.add("432189571389352");
        numList.add("432189571389353");
        numList.add("432189571389354");
    }
    public void handleRequest(String number){
        if(numList.contains(number)){
            System.out.println("该人在北京居住");
        }else{
            System.out.println("该人不在北京居住");
            if(handler!=null){
                handler.handleRequest(number);
            }
        }
    }
    public void setNextHandler(Handler handler){
        this.handler=handler;
    }
}

具体处理者2:Shanghai.java

/**
 * Shanhai
 */
import java.util.ArrayList;

/**
 * Beijing
 */
public class Shanghai implements Handler{
    private Handler handler;
    private ArrayList<String> numList;
    Shanghai(){
        numList = new ArrayList<String>();
        numList.add("532189571389351");
        numList.add("532189571389352");
        numList.add("532189571389353");
        numList.add("532189571389354");
    }
    public void handleRequest(String number){
        if(numList.contains(number)){
            System.out.println("该人在上海居住");
        }else{
            System.out.println("该人不在上海居住");
            if(handler!=null){
                handler.handleRequest(number);
            }
        }
    }
    public void setNextHandler(Handler handler){
        this.handler=handler;
    }
}

具体处理者3:Tianjin.java

/**
 * Tianjin
 */
import java.util.ArrayList;

/**
 * Tianjin
 */
public class Tianjin implements Handler{
    private Handler handler;
    private ArrayList<String> numList;
    Tianjin(){
        numList = new ArrayList<String>();
        numList.add("632189571389351");
        numList.add("632189571389352");
        numList.add("632189571389353");
        numList.add("632189571389354");
    }
    public void handleRequest(String number){
        if(numList.contains(number)){
            System.out.println("该人在天津居住");
        }else{
            System.out.println("该人不在天津居住");
            if(handler!=null){
                handler.handleRequest(number);
            }
        }
    }
    public void setNextHandler(Handler handler){
        this.handler=handler;
    }
}

 程序应用

/**
 * 应用程序
 */
public class Application {
    private Handler beijing,shanghai,tianjin;
    public void createChain(){
        beijing = new Beijing();
        shanghai = new Shanghai();
        tianjin = new Tianjin();
        beijing.setNextHandler(shanghai);
        shanghai.setNextHandler(tianjin);
    }
    public void responseClient(String number){
        beijing.handleRequest(number);
    }
    public static void main(String[] args){
        Application application = new Application();
        application.createChain();
        application.responseClient("632189571389352");
    }
}

该人不在北京居住
该人不在上海居住
该人在天津居住

 

 责任链模式的优点

  • 责任链的对象只和自己的后继对象是低耦合关系
  • 当在处理者中分配职责时,责任链给应用程序更多的灵活性
  • 应用程序可以动态的增加和删除处理者或重新指派处理者的职责
  • 应用程序可以动态的改变处理者的顺序
  • 用户不必知道处理者的信息

责任链模式的应用场景

Java Web中的过滤器链、Struts2中的拦截器栈。

posted @ 2017-04-25 16:30  且听风吟-wuchao  阅读(171)  评论(0编辑  收藏  举报