第九章_____责任链模式

九霄龙吟惊天变,风云际会浅水游。看来今天风云是潜水游了,东方西方都黑了,股市基金都在亏,这使我郁闷的什么都不想干;本想回去喝点小酒吃点小菜;唉,想了想有好几天没写博客了;岂能虚度光阴我们还是应该再学习一种设计模式才能心安;至少现在还是安身立命的本事;坚持不懈方能有个好结果;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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 1 场景问题# 1.1 申请聚餐费用## 来考虑这样一个功能:申请聚餐费用的管理。 很多公司都有这样的福利,就是项...
    七寸知架构阅读 3,069评论 3 58
  • 写点故事吧。每天学习着不知道的知识,看着各种不同的数据,就是想让自己变成想象中的自己,让自己的生活变成想象中的生活...
    蒹葭如梦阅读 141评论 0 0
  • 带着第一次参加教育行走的激动与惊喜,飞机降落在厦门高崎国际机场,下了飞机,热情的厦门人就像这流火的七月一样热...
    暖阳西子阅读 823评论 0 3
  • 阿萨德导弹在韩国部署你们知道了吗?可怕吧!可怕的很呐!那怎么办?
    aaaaaaaaaaa_阅读 184评论 0 0