责任链模式
定义:
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关 系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
我们通过一个简单的例子来了解责任链模式
场景:古代女子三从四德,“三从”是指“未嫁从父、既嫁从夫、夫 死从子”。也就是说,一位女性在结婚之前要听从于父亲,结婚之后要听从于丈夫,如果丈夫死了还要听从于儿子。下面我们用程序来展示古代女子请示出门逛街流程。
定义女子抽象类,定义女子当前状态和请示内容
public abstract class IWomen {
//判断条件
protected abstract int getType();
//请示要做什么
protected abstract String getRequest();
}
实现类
public class Women extends IWomen {
/** 通过一个int类型的参数来描述妇女的个人状况
* 1--未出嫁 * 2--出嫁 * 3--夫死
*
*/
private int type;
private String request;
public Women(int type, String request) {
this.type = type;
this.request = request;
}
@Override
protected int getType() {
return this.type;
}
@Override
protected String getRequest() {
return this.request;
}
}
责任链核心抽象类
需要注意的是,在设置下一个责任人的时候使用了递归,因此需要控制责任链长度,否则会影响性能
public abstract class Handler {
public final static int FATHER_LEVEL_REQUEST = 1;
public final static int HUSBAND_LEVEL_REQUEST = 2;
public final static int SON_LEVEL_REQUEST = 3;
//能处理的级别
private int level = 0;
//下一个责任人
private Handler nextHandler;
public Handler(int level) {
this.level = level;
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final void handlerMessage(IWomen women) {
if (women.getType() == this.level) {
this.response(women);
} else {
if (nextHandler != null) {
this.nextHandler.handlerMessage(women);
} else {
// do nothing
}
}
}
//请示回应
public abstract void response(IWomen women);
}
实现类
public class Father extends Handler {
public Father() {
super(Handler.FATHER_LEVEL_REQUEST);
}
@Override
public void response(IWomen women) {
System.out.println("-----女儿向父亲请示------");
System.out.println(women.getRequest());
System.out.println("父亲的答复是:同意");
}
}
public class Husband extends Handler {
public Husband() {
super(Handler.HUSBAND_LEVEL_REQUEST);
}
@Override
public void response(IWomen women) {
System.out.println("-----妻子向丈夫请示------");
System.out.println(women.getRequest());
System.out.println("丈夫的答复是:同意");
}
}
public class Son extends Handler {
public Son() {
super(Handler.SON_LEVEL_REQUEST);
}
@Override
public void response(IWomen women) {
System.out.println("-----母亲向儿子请示------");
System.out.println(women.getRequest());
System.out.println("儿子的答复是:同意");
}
}
客户端
public class Client {
public static void main(String[] args) {
Random random = new Random();
List<IWomen> womenList = new ArrayList<IWomen>();
for (int i = 0; i < 5; i++) {
womenList.add(new Women(random.nextInt(4), "我要出去逛街"));
}
Father father = new Father();
Husband husband = new Husband();
Son son = new Son();
//设置责任链顺序
father.setNextHandler(husband);
husband.setNextHandler(son);
womenList.stream().forEach(e-> father.handlerMessage(e));
}
}
运行结果
-----女儿向父亲请示------
我要出去逛街
父亲的答复是:同意
-----妻子向丈夫请示------
我要出去逛街
丈夫的答复是:同意
-----母亲向儿子请示------
我要出去逛街
儿子的答复是:同意
-----妻子向丈夫请示------
我要出去逛街
丈夫的答复是:同意

浙公网安备 33010602011771号