第九章_____责任链模式
九霄龙吟惊天变,风云际会浅水游。看来今天风云是潜水游了,东方西方都黑了,股市基金都在亏,这使我郁闷的什么都不想干;本想回去喝点小酒吃点小菜;唉,想了想有好几天没写博客了;岂能虚度光阴我们还是应该再学习一种设计模式才能心安;至少现在还是安身立命的本事;坚持不懈方能有个好结果;Ok,我们今天看看责任链模式。过一段时间我会研究下Mina框架,并且记录下心得;
责任链模式定义:
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 object
handles it.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关
系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)
官方定义很抽象;我们要用个例子来说明比较好;设计模式就是这样;理论指导实践;没有实践理论也是扯几把蛋;好了我们写个简单的Demo看看:
写之前我也关注了下网上别人写的,以费用报销为例确实是一个不错的业务场景;但是我们就不用这个;我觉得书上那个例子不错;古代人尊从三纲五常: 君为臣纲,君不正,臣投他国。国为民纲,国不正,民起攻之。父为子纲,父不慈,子
奔他乡。子为父望,子不正,大义灭亲。夫为妻纲,夫不正,妻可改嫁。妻为夫助,妻不贤,夫则休之。——出自《封神演义》
我们今天就用程序演示一下古代女子的三纲五常:
我们定义一个女人的抽象:
package com.ldl.test;
/**
* @author deling 2017年11月15日
*/
public interface IWomen {
// 获得个人类型状况 ;1是未结婚;2是已经结婚的,而且丈夫健在;3是丈夫去世了
public int getType();
// 获得个人请求
public String getRequest();
}
实现一个具体实例:
package com.ldl.test;
/**
* @author deling 2017年11月15日
*/
public class Women implements IWomen {
private int type = 0;
private String request = "";
@Override
public int getType() {
// TODO Auto-generated method stub
return this.type;
}
public Women(int type, String request) {
super();
this.type = type;
switch (this.type) {
case 1:
this.request = "女儿请求是::" + request;
break;
case 2:
this.request = "妻子的请求是::" + request;
break;
case 3:
this.request = "母亲的请求是::" + request;
break;
default:
break;
}
this.request = request;
}
@Override
public String getRequest() {
// TODO Auto-generated method stub
return this.request;
}}
下面我们来搞一个处理请求的抽象:
package com.ldl.test;
/**
* @author deling 2017年11月15日
*/
public abstract class Handler {
private Handler nextHandler = null;
private int lever = 0;
public static int Father_LEVER = 2;
public static int HUSBAND_LEVEL_REQUEST = 3;
public static int SON_LEVEL_REQUEST = 4;
protected abstract void handlerResult(IWomen women);
public void handlerMessage(IWomen women) {
if (women.getType() == this.lever) {
this.handlerResult(women);
} else {
if (this.nextHandler != null) {
this.nextHandler.handlerMessage(women);
} else {
System.out.println("没有人可请示了。。。不同意");
}
}
}
/**
* @return the lever
*/
public int getLever() {
return lever;
}
/**
* @param lever
* the lever to set
*/
public void setLever(int lever) {
this.lever = lever;
}
public Handler(int lever) {
super();
this.lever = lever;
}
/**
* @return the nextHandler
*/
public Handler getNextHandler() {
return nextHandler;
}
/**
* @param nextHandler
* the nextHandler to set
*/
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
} }
Ok下面做三个具体实现,丈夫 儿子,父亲:
package com.ldl.test;
/**
* @author deling 2017年11月15日
*/
public class HusBand extends Handler {
/**
* @param lever
*/
public HusBand() {
super(Handler.HUSBAND_LEVEL_REQUEST);
// TODO Auto-generated constructor stub
}
/*
* (non-Javadoc)
*
* @see com.ldl.test.Handler#handlerResult(com.ldl.test.IWomen)
*/
@Override
protected void handlerResult(IWomen women) {
System.out.println("-------" + "老婆向老公请示" + "------");
System.out.println(women.getRequest());
System.out.println("老公回答:同意");
}
}
儿子类:
package com.ldl.test;
/**
* @author deling
*2017年11月15日
*/
public class Son extends Handler {
/**
* @param lever
*/
public Son() {
super(Handler.SON_LEVEL_REQUEST);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see com.ldl.test.Handler#handlerResult(com.ldl.test.IWomen)
*/
@Override
protected void handlerResult(IWomen women) {
// TODO Auto-generated method stub
System.out.println("-------" + "母亲向儿子请示" + "------");
System.out.println(women.getRequest());
System.out.println("儿子回答:同意");
}
}
父亲类:
package com.ldl.test;
/**
* @author deling 2017年11月15日
*/
public class Father extends Handler {
/**
* @param lever
*/
public Father() {
super(Handler.Father_LEVER);
}
@Override
protected void handlerResult(IWomen women) {
System.out.println("-------" + "女儿向父亲请示" + "------");
System.out.println(women.getRequest());
System.out.println("父亲回答:同意");
}
}
测试下:
图片.png 图片.png
我们随机找了5个女人测试;结果还不错;所谓责任链就是形象上程序设计每个对象的职责相互依赖, A持有B的实例,B持有C的实例;A能处理A处理不能处理交给B;依次类推;作为Android 程序员玩到这里自然就想到了Android中的事件处理机制不就是这种责任链模式吗.
总结:
责任链模式也可以结合模板方法模式来玩的;例子中的handlerMessage就是模板方法模式的体现:
在责任链模式中一个请求发送到链中后,前一节点消费部分消息,然后交由后续
节点继续处理,最终可以有处理结果也可以没有处理结果,读者可以不用理会什么纯的、不
纯的责任链模式。
在实际应用中,一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接
返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了高层次模
块的调用,减少模块间的耦合,提高系统的灵活性。
优点:
责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处
理者可以不用知道请求的全貌
缺点:
一是性能问题,每个请求都是从链头遍历到链尾;
二是调试不很方便,特别是链条比较长,
环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂:
下面是一个UML类图
图片.png