玩转设计模式

第九章_____责任链模式

2017-11-15  本文已影响0人  博尔特uncle

九霄龙吟惊天变,风云际会浅水游。看来今天风云是潜水游了,东方西方都黑了,股市基金都在亏,这使我郁闷的什么都不想干;本想回去喝点小酒吃点小菜;唉,想了想有好几天没写博客了;岂能虚度光阴我们还是应该再学习一种设计模式才能心安;至少现在还是安身立命的本事;坚持不懈方能有个好结果;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
上一篇 下一篇

猜你喜欢

热点阅读