常见设计模式之Chain of Responsibility模式

责任链模式应用于多个对象可以处理同一个请求的情况,为了简化客户端的调用,客户端只需将一个请求提交到处理对象中(简化客户端后调用后,客户端并不知道该把请求转发到哪个对象中),处理对象会自动寻找一些列的对象处理该对象,若对象的请求成功处理,那么请求转发就终止,否则,一直往下传递请求。

其实这个应用场景在日常生活中很常见,比如找领导签字,下面是一个简单的找领导签字的demo,注释都写好了,比较简单

结构图如下:


程序代码如下:

package net.liuyx.test;

public class ChainOfResponsiblityTest {
	public static void main(String[] args) {
		SignHandler handler = new DeskClerk();//老百姓去找领导签字,首先去见的是一些小喽啰,比如这里的接待员
		Signature signature = Signature.Normal;//老百姓带了个签字难度适中的文件,不知道该给谁,但肯定的是在这个局里能得到最终结果
		handler.sign(signature);//这个局里的相关人员处理这个签名
	}
}
/**
 * 这里的签名其实像盖章,关键是要拿到领导的章,章会自动把字印出来的,领导那鬼字谁稀罕!
 * @author liuyx
 *
 */
enum Signature {
	Simple {
		void print() {
			System.out.println("哦,这个签字程序很简单");
		}
	},
	Normal {
		void print() {
			System.out.println("哈,这个签名程序难度一般");
		}
	},
	Hard {
		void print() {
			System.out.println("额,这个签名程序比较复杂");
		}
	};
	abstract void print();
}

abstract class SignHandler {
	SignHandler nextSignHandler;

	abstract boolean sign(Signature signature);

	public SignHandler getNextHandler() {
		return nextSignHandler;
	}

	public void setNextHandler(SignHandler handler) {
		nextSignHandler = handler;
	}
}
/**
 * 前台接待员
 * @author user
 *
 */
class DeskClerk extends SignHandler {
	private static final Signature signatureState = Signature.Simple;

	@Override
	boolean sign(Signature signature) {
		if (signature.equals(this.signatureState)) {
			signature.print();
			System.out.println("接待员签字就可以了");
			return true;
		}
		setNextHandler(new Chief());
		getNextHandler().sign(signature);
		return false;
	}
}
/**
 * 处长
 * @author user
 *
 */
class Chief extends SignHandler {
	private static final Signature signatureState = Signature.Normal;

	@Override
	boolean sign(Signature signature) {
		if (signature.equals(this.signatureState)) {
			signature.print();
			System.out.println("处长签字就可以了");
			return true;
		}
		setNextHandler(new Head());
		getNextHandler().sign(signature);
		return false;
	}
}
/**
 * 最终领导,局长
 * @author user
 *
 */
class Head extends SignHandler {
	private static final Signature signatureState = Signature.Hard;

	@Override
	boolean sign(Signature signature) {
		if (signature.equals(this.signatureState)) {
			signature.print();
			System.out.println("局长签字了");
			return true;
		}
		System.out.println("对不起,你找错地方签字了,这个章我们这边盖不了");
		return false;
	}
}
程序输出为:

很多框架中的事件处理其实用的也是责任链模式,用户点击某个UI事件,该事件所在的UI就处理该事件,若处理不了,则一直上浮事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值