您的位置:首页 > Web前端

《您的设计模式》(CBF4LIFE)之“责任链模式”【整理】

2016-10-27 13:26 489 查看
背景:中国古代对妇女指定了“三从四德”的道德规范,“三从”是指“未嫁从父、既嫁从夫、夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的。

通过程序描述一下古代妇女的“三从”制度。

父亲、丈夫、儿子每个节点有两个选择:要么承担责任,做出回复;要么把请求转发到后序环节。

 

三个实现类Father、Husband、Son只要实现构造函数和父类中的抽象方法就可以了,具体怎么处理这些请求,都已经转移到了Handler抽象类中。

1、 抽象类如下:

package com.teng.pattern.abs;

/**
* 处理者抽象类
* <br>创建日期:2016年8月1日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public abstract class Handler {

private int type = 0;//1:未嫁 2:出嫁 3:父死

/**
* 下一个处理者
*/
private Handler nextHandler;

protected Handler(int type){
this.type = type;
}

/**
* 处理女人请求
* @since 1.0
* @param women
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年8月1日 下午10:16:43
*/
public final void messageHandler(IWomen women){
if(women.getType() == this.type){
this.response(women);
}else{
if(this.nextHandler != null){
this.nextHandler.messageHandler(women);
}else{
System.out.println("没有处理者。。。。。。。。");
}
}
}

/**
* 设置下一个处理者
* @since 1.0
* @param handler
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年8月1日 下午9:55:25
*/
public void setNextHandler(Handler handler){
this.nextHandler = handler;
}

/**
* 返回请求信息
* @since 1.0
* @param women
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年8月1日 下午10:19:17
*/
public abstract void response(IWomen women);

}


2、3个实现类

package com.teng.pattern.impl;

import com.teng.pattern.abs.Handler;
import com.teng.pattern.abs.IWomen;

/**
* 父亲
* <br>创建日期:2016年8月1日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Father extends Handler {

Father(){
super(1);
}

@Override
public void response(IWomen women) {
System.out.println("父亲听女儿说。。。。。。");
System.out.println(women.getResponse());
System.out.println("父亲同意。。。。。。");
}

}

package com.teng.pattern.impl;

import com.teng.pattern.abs.Handler;
import com.teng.pattern.abs.IWomen;

/**
* 丈夫
* <br>创建日期:2016年8月1日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Husband extends Handler {

Husband(){
super(2);
}

@Override
public void response(IWomen women) {
System.out.println("丈夫听妻子说。。。。。。");
System.out.println(women.getResponse());
System.out.println("丈夫同意。。。。。。");
}

}
package com.teng.pattern.impl;

import com.teng.pattern.abs.Handler;
import com.teng.pattern.abs.IWomen;
/**
* 儿子
* <br>创建日期:2016年8月1日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Son extends Handler {

protected Son() {
super(3);
}

@Override
public void response(IWomen women) {
System.out.println("儿子听母亲说。。。。。。");
System.out.println(women.getResponse());
System.out.println("儿子同意。。。。。。");
}

}

3、 Women的接口与实现类

package com.teng.pattern.abs;

/**
* 女人 接口
* <br>创建日期:2016年8月1日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public interface IWomen {

/**
* 获取女人类型
* @since 1.0
* @return
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年8月1日 下午9:59:50
*/
public int getType();

/**
* 获取女人的请求信息
* @since 1.0
* @return
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年8月1日 下午10:00:08
*/
public String getResponse();

}
package com.teng.pattern.abs;

/**
* 女人实现类
* <br>创建日期:2016年8月1日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Women implements IWomen {

/**
* 女人类型
*/
private int type = 0;

/**
* 女人请求信息
*/
private String response = "";

/**
* 构造器
* @param _type t
* @param _response r
*/
public Women(int _type,String _response){
this.type = _type;

switch(this.type){
case 1:
this.response = "女儿说 : "+_response;
break;
case 2:
this.response = "妻子说 : "+_response;
break;
case 3:
this.response = "母亲说 :  "+_response;
}
}

@Override
public int getType() {
return this.type;
}

@Override
public String getResponse() {
return this.response;
}

}

客户端:

package com.teng.pattern.impl;

import java.util.ArrayList;
import java.util.Random;

import com.teng.pattern.abs.Handler;
import com.teng.pattern.abs.IWomen;
import com.teng.pattern.abs.Women;

/**
* 客户端
* <br>创建日期:2016年8月1日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Client {

/**
* 主方法
* @since 1.0
* @param args
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年8月1日 下午10:28:53
*/
public static void main(String[] args) {
Random rand = new Random();
ArrayList<IWomen> list = new ArrayList<IWomen>();

for(int i = 0 ;i < 5 ; i++){
list.add(new Women(rand.nextInt(4),"逛街。。。。。。"));
}

Handler father = new Father();
Handler husband = new Husband();
Handler son = new Son();

father.setNextHandler(husband);
husband.setNextHandler(son);

for(IWomen women : list){
System.out.println(women.getType()+"-----------------");
father.messageHandler(women);
}
}
}

以上讲解的就是责任链模式,你看Father、Husband、Son这三个类的处理女性的请求时,是不是在传递,每个环节只有两个选项:要么承担责任做出回应,要么向下传递请求,最终会有环节做出回应。

 

`模式在经验中积累的,是知识的结晶,而不是死板硬套的模子。

责任链模式屏蔽了请求的处理过程,你发起一个请求到底是谁处理的,这个你不用关心,只要你把请求抛给责任链的第一个处理者,最终会返回一个处理结果(当然也可以不做任何处理),作为请求者可以不用知道到底是需要谁来处理的,这是责任链模式的核心。

责任链有一个缺点是大家在开发的时候要注意:调试不是很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

 

观察者模式也可以实现请求的传递,比如一个事件发生了,通知了观察者,同时观察者又作为一个被观察者,通知了另外一个观察者,这也形成了一个事件广播链,这和我们今天将的责任链是有区别的:

受众数量不同。观察者广播链式可以1:N的方式广播,而责任链则要求是1:1的传递,必然有一个且只有一个类完成请求的处理;

请求内容不同。观察者广播链中的信息可以在传播中改变,但是责任链中的请求是不可改变的;

处理逻辑不同。观察者广播链主要用于触发联动动作,而责任链则是对一个类型的请求按照既定的规则进行处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式