概括
使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到一个对象该处理它为止。
概述
在设计Java程序时,肯能需要设计很多对象来满足用户的请求。如,要建立一个古瓷器鉴定系统,一个好的设计方案就是将古瓷器分门别类,然后创建若干对象,每个对象负责处理一类古瓷器的鉴定。为了能更好地组织这些醋则鉴定古瓷器的对象,可以将这些方案组成一个责任链,当需要鉴定瓷器时,先让责任链上的第一个对象来处理用户的请求,若能处理便反馈处理结果,否则就传递给责任链的下一个对象,以次类推。
责任链模式是使用多个对象处理用户请求的成熟模式,责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成一个责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象,如果能处理用户的请求,就做处理不再传递请求,否则就传递请求给责任链上下一个对象。
UML类图
责任链模式的两种角色
- 处理者(Handler):处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法。
- 具体处理者(ConcreteHandler):具体处理者是实现处理者接口的类的实例。具体处理者通过调用处理者的接口规定的方法处理用户的请求,即在接到用户的请求后就调用接口规定的方法,在执行该方法的过程中,若发现能处理该请求,及处理有关数据,否则就反馈无法处理给用户,然后将请求传递给自己的后继对象。
注:处理者最好使用接口来表示,若用抽象类会使具体处理者无法击沉跟其他类,限制到了具体处理者的能力
应用:
在一个捐助衣物箱中 有裤子和上衣 分别有不同的工作人员处理
public interface MyHandler {
public abstract void hanleClothes(String name);
public abstract void setNextHandler(MyHandler handler);
}
public class CoatHandler implements MyHandler{
private MyHandler nextHandler;
@Override
public void hanleClothes(String name) {
// TODO Auto-generated method stub
if(name.endsWith("衣")){
System.out.println("CoatHandler 成功处理" + name);
}else{
if(nextHandler != null){
nextHandler.hanleClothes(name);
}else{
System.out.println("责任链已到尽头");
}
}
}
@Override
public void setNextHandler(MyHandler handler) {
// TODO Auto-generated method stub
nextHandler = handler;
}
}
public class TrousersHandler implements MyHandler{
private MyHandler nextHandler;
@Override
public void hanleClothes(String name) {
// TODO Auto-generated method stub
if(name.endsWith("裤")){
System.out.println("TrousersHandler 成功处理" + name);
}else{
if(nextHandler != null){
nextHandler.hanleClothes(name);
}else{
System.out.println("责任链已到尽头");
}
}
}
@Override
public void setNextHandler(MyHandler handler) {
// TODO Auto-generated method stub
nextHandler = handler;
}
}
public class Application {
private MyHandler coatHandler,trousersHandler;
public void createChain(){
coatHandler = new CoatHandler();
trousersHandler = new TrousersHandler();
coatHandler.setNextHandler(trousersHandler);
}
public void reponseClient(String name){
coatHandler.hanleClothes(name);
}
public static void main(String[] args) {
Application application = new Application();
application.createChain();
application.reponseClient("牛仔衣");
application.reponseClient("西装裤");
}
}
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。
优点
- 责任链中的对象只和自己的后继是低耦合关系,和其他对象没有关系,这使得编写处理者对象 及创建责任链非常容易。
- 应用程序可以动态地增加 删除 处理者或重新指派处理者的职责。
- 应用程序可以动态改变责任链中的处理者之间的先后顺序。
参考:http://blog.csdn.net/m13666368773/article/details/7702368