设计模式之责任链模式

什么是责任链模式

责任链设计模式主要构成有抽象处理者、具体处理者、客户类,在处理请求的时候,将请求通过客户类发送至处理链路上,这样链路上所有处理对象都有机会处理请求,使发送者与接收者之间解耦。


使用场景

当请求到来时,不知道由哪个具体对象去处理或者每个对象都需要处理请求的时候,可以使用责任链模式。比如在论坛发表一篇文章,后台需要经过一系列处理(过滤、敏感词等)才可以发表或进入数据库,这时,就可以使用责任链模式,不同处理对象,使用不同的封装类组装成一个处理链路,使用这个处理链路去处理论坛发表文章的请求。

责任链的基本条件

要实现责任链模式,需要满足该模式的基本条件:

  1. 对象链的组织。需要将某任务的所有责任执行对象以链的形式加以组织。
  2. 消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
  3. 处于对象链中的对象的职责分配。不同对象完成不同的职责。
  4. 任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。

责任链模式的实现

我们编写一个组装车的处理接口,分别实现其组装车头、组装车身、组装车尾的处理类。

interface CarHandler {
	void handlerCar();//组装车
}
class CarHeadHandler implements CarHandler {
	public void handlerCar() {
		System.out.println("组装车头");
	}
}
class CarBodyHandler implements CarHandler {
	public void handlerCar() {
		System.out.println("组装车身");
	}
}
class CarTailHandler implements CarHandler {
	public void handlerCar() {
		System.out.println("组装车尾");
	}
}

如果我们需要组装一辆车,我们需要进行以下操作

CarHandler head = new CarHeadHandler();
CarHandler body = new CarBodyHandler();
CarHandler tail = new CarTailHandler();
head.handlerCar();
body.handlerCar();
tail.handlerCar();

假如我们想要使用责任链模式,我们需要使用一个类来链式地存储我们的处理对象

//我们需要一个类负责存储组装对象引用
class CarChain {
	//用于存储处理类对象
	private List<CarHandler> list = new ArrayList<CarHandler>();
	//需要有一个方法获得处理类对象
	//同时返回当前类
	public CarChain add(CarHandler carHandler) {
		list.add(carHandler);
		return this;
	}
	public void handlerCar() {
		for (CarHandler carHandler : list) {
			carHandler.handlerCar();
		}
	}
}

我们组装一辆车的操作就成了以下:

CarChain carChain = new CarChain();
carChain.add(new CarHeadHandler())
	.add(new CarBodyHandler())
	.add(new CarTailHandler());
carChain.handlerCar();

在这里插入图片描述上图显示了该执行流程,倘若我们想要将另一个carChain加入到当前carChain去执行,我们该怎么做呢?
在这里插入图片描述
事实上,我们的CarChain同样也可以去实现CarHandler接口,那么,我们就可以实现下面的使用。

CarChain carChain = new CarChain();
carChain.add(new CarHeadHandler())
	.add(new CarBodyHandler())
	.add(new CarTailHandler());

CarChain carChain2 = new CarChain();
carChain2.add(new CarHeadHandler())
    .add(new CarBodyHandler())
	.add(new CarTailHandler());

carChain.add(carChain2);
carChain.handlerCar();

如果我们需要由CarChain中的某一个处理类来决定链条是否继续,我们可以将接口方法handlerCar返回值改为boolean类型。

boolean handlerCar();
//CarChain 中的handlerCar方法
public boolean handlerCar() {
	for (CarHandler carHandler : list) {
		if(!carHandler.handlerCar()) {
			return false;
		}
	}
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值