责任链模式
责任链模式定义如下:
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);
}
}