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

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

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

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

 

三个实现类FatherHusbandSon只要实现构造函数和父类中的抽象方法就可以了,具体怎么处理这些请求,都已经转移到了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);
	
}


23个实现类

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);
		}
	}
}

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

 

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

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

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

 

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

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

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

处理逻辑不同。观察者广播链主要用于触发联动动作,而责任链则是对一个类型的请求按照既定的规则进行处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值