个人博客:打开链接
责任链模式的定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
例子:古代妇女的枷锁—-三从四德
古代女子要 “三从四德”,这里的三从是什么呢?是指“未嫁从父,既嫁从夫,夫死从子”。也就是说,一位女性在结婚前听父亲的,结婚后听丈夫的,丈夫G了听儿子的,没有儿子听小叔子的。
代码:
public interface IWomen {
//获得个人状况
public int getType();
//获得个人请示,你要干什么?出去逛街?约会?看电影?
public String getRequest();
}
public class Women implements IWomen {
/*
* 通过一个int类型的参数来描述妇女的个人情况
* 1 - - 未出嫁
* 2 - - 出嫁
* 3 -- 夫死
*/
private int type = 0;
private String request = "";
public Women(int _type, String _request){
this.type = _type;
//便于显示,做点处理
switch (this.type){
case 1:
this.request = "女儿的请求是:" + _request;
break;
case 2:
this.request = "妻子的请求是:" + _request;
break;
case 3:
this.request = "母亲的请求是:" + _request;
}
}
public int getType(){
return type;
}
@Override
public String getRequest() {
return request;
}
}
public abstract class IHandler {
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 IHandler nextHandler;
public IHandler(int _level){
this.level = _level;
}
public final void HandlerMessage(IWomen women){
if(women.getType() == this.level){
this.response(women);
}else{
if(this.nextHandler != null){
this.nextHandler.HandlerMessage(women);
}
}
}
protected abstract void response(IWomen women);
public void setNext(IHandler _handler){
this.nextHandler = _handler;
}
}
public class Father extends IHandler{
public Father(){
super(IHandler.FATHER_LEVEL_REQUEST);
}
@Override
protected void response(IWomen women) {
System.out.println("------------女儿向父亲请示------------");
System.out.println("女儿的请示是:" + women.getRequest());
System.out.println("父亲的答复是:同意");
}
}
public class Husband extends IHandler {
public Husband() {
super(IHandler.HUSBAND_LEVEL_REQUEST);
}
@Override
protected void response(IWomen women) {
System.out.println("------------妻子向丈夫请示------------");
System.out.println("妻子的请示是:" + women.getRequest());
System.out.println("丈夫的答复是:同意");
}
}
public class Son extends IHandler {
public Son(){
super(IHandler.SON_LEVEL_REQUEST);
}
@Override
protected 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();
ArrayList<IWomen> arrayList = new ArrayList<>();
for(int i = 0; i < 5; ++i){
arrayList.add(new Women(random.nextInt(4), "宝宝中秋要去逛街"));
}
IHandler father = new Father();
IHandler husband = new Husband();
IHandler son = new Son();
father.setNext(husband);
husband.setNext(son);
for(IWomen women:arrayList){
father.HandlerMessage(women);
}
}
}
责任链模式的优缺点
- 1:优点。责任链模式将请求和处理分开,提高系统灵活性。
- 2:缺点。性能为题,每个请求都是从链头便利到链尾;调试不方便,链条比较长,环节比较多时。
注意
- 1:责任链模式中一个请求发送到链中后,前一节点消费部分消息,然后交由后续节点继续处理,最终可以处理结果也可以没有处理结果。
- 2:链条节点数量需要控制,避免出现超长链的情况。