您的位置:首页 > 其它

设计模式之责任链模式

2017-07-31 16:43 344 查看
一、定义:责任链模式使第一个对象处理请求,然后一次向下传递请求,直到有一个合适的对象能够处理他,从而避免的调用者依次去询问各个对象造成的多耦合关系。Avoid coupling the sender  of a request to its receiver by giving more than one object a chance to handle the request. Chain the reviever objects and pass
the request along the chain until an object handles it

二、简单代码示例:

public abstract class Handler {
private Handler nextHandler;
private String myName;
private Integer request;

public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}

public void setMyName(String myName) {
this.myName = myName;
}

public void setRequest(Integer request) {
this.request = request;
}

public final String handleMessage(int request) {
if (request == this.request)
return myName;
else if (this.nextHandler != null)
return this.nextHandler.handleMessage(request);
else
return "No one";
}

处理者:
public class Object1 extends Handler {
public Object1(String name, int age, Handler next) {
setMyName(name);
setRequest(age);
setNextHandler(next);
}

//Other method in object1
}
public class Object2 extends Handler {
public Object2(String name, int age, Handler next) {
setMyName(name);
setRequest(age);
setNextHandler(next);
}

//other method in Object2
}
public class Object3 extends Handler {
public Object3(String name, int age, Handler next) {
setMyName(name);
setRequest(age);
setNextHandler(next);
}

// other method in Object3
}


场景调用:
public static void main(String[] args) {
// TODO Auto-generated method stub
Handler handler3 = new Object3("小红", 12, null);
Handler handler2 = new Object3("小明", 11, handler3);
Handler handler1 = new Object3("小芳", 10, handler2);

System.out.println("谁的年纪是12岁啊?");
System.out.println(handler1.handleMessage(12));

System.out.println("谁的年纪是13岁啊?");
System.out.println(handler1.handleMessage(13));

}
谁的年纪是12岁啊?
小红
谁的年纪是13岁啊?
No one

责任链模式十分简单。其减少了场景调用的耦合关系。请求者可以不用知道是谁处理的,只要知道结果即可。正如DNS的域名解析过程。
责任链过长的话,会给性能带来一定影响,同时使得调试变得复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息