责任链模式

责任链模式定义如下:
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an objecthandles it.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)责任链模式

古代女子的三从四德, 想要做些 什么都得请示一下经过允许之后才可,在家从父,出嫁从夫,老后从子,如下是请示的流程;这正是一个典型的责任链模式。以下图2是顺序处理的类图

责任链模式

责任链模式

从类图上看,三个实现类Father、Husband、Son只要实现构造函数和父类中的抽象方法response就可以了,具体由谁处理女性提出的请求,都已经转移到了Handler抽象类中,代码如下;

package design_mode;

public interface IWoman {
    public abstract int getType();
    public abstract String getRequest();
}


package design_mode;

public class Woman implements IWoman{
    private int m_type = 0;
    private String m_request="";
    public Woman(int type, String str){
        this.m_request = str;
        switch(type){
        case 1:
            this.m_type = 1;
            this.m_request = "daddy, "+ this.m_request;
            break;
        case 2:
            this.m_type = 2;
            this.m_request = "darling, "+ this.m_request;
            break;
        case 3:
            this.m_type = 3;
            this.m_request = "my son, "+ this.m_request;
            break;
        default:
        
        }
    }
    @Override
    public int getType() {
        return this.m_type;
    }

    @Override
    public String getRequest() {
        return this.m_request;
    }

}


package design_mode;

public interface Ihandler {
    public abstract void HandleRequest(IWoman request);
}

package design_mode;

public abstract class Handler implements Ihandler{
    public static final int FATHER_DO=1;
    public static final int HUNSBAND_DO=2;
    public static final int SON_DO=3;
    
    private int m_type;
    private Handler m_nextHandler;
    
    public void setNextHandler(Handler handler){
        this.m_nextHandler = handler;
    }
    //每个子类都要说明一下自己所处理的类型,显示构造
    public Handler(int type){
        this.m_type = type;
    }
    
    @Override
    public void HandleRequest(IWoman request) {
        // TODO 自动生成的方法存根
        if(request.getType() == this.m_type){
            this.response(request);
            
        }else {
            if(this.m_nextHandler != null){
                this.m_nextHandler.HandleRequest(request);
            }else{
                System.out.println("req: "+request.getRequest());
                System.out.println("---not ok---\n");
            }
            
        }
    }
    //子类实现抽象接口
    protected abstract void response(IWoman woman );

}

package design_mode;

public class Father extends Handler{
    public Father() {
        super(Handler.FATHER_DO);
    }

    @Override
    protected void response(IWoman woman) {
        String res = "Ok, you can do it!";
        System.out.println("........女儿向父亲请示.......");
        System.out.println("req: "+woman.getRequest());
        System.out.println("res: "+res);
        //return res;
    }

}

package design_mode;

public class Husband  extends Handler{

    public Husband() {
        super(Handler.HUNSBAND_DO);
    }

    @Override
    protected void response(IWoman woman) {
        String res = "Ok, i'll go with you !";
        System.out.println("........妻子向丈夫请示.......");
        System.out.println("req: "+woman.getRequest());
        System.out.println("res: "+res);
    }

}


package design_mode;

public class Son  extends Handler{

    public Son() {
        super(Handler.SON_DO);
    }

    @Override
    protected void response(IWoman woman) {
        System.out.println("........母亲向儿子请示.......");
        String res = "Ok, please come back soon !";
        System.out.println("req: "+woman.getRequest());
        System.out.println("res: "+res);
    }

}

package design_mode;
import design_mode.Father;
import design_mode.Handler;

public class Chain_respon {
    public static void main(String [] args){
    Handler fobj = new Father();
    Handler hobj = new Husband();
    Handler sobj = new Son();
    
    fobj.setNextHandler(hobj);
    hobj.setNextHandler(sobj);
    String str="I'd like to go shopping ";
    Woman woman1 = new Woman(2,str);
    fobj.HandleRequest(woman1);
 }
}


责任链模式