重拾设计模式-责任链模式

责任链模式是对象的行为模式,对调用者屏蔽内部处理细节,请求依次被链上节点处理,可随时添加或修改处理节点,更好划分职责。还介绍了代理实现及测试,列举了请假流程、JavaWeb请求处理、发邮箱等常见使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:责任链模式属于对象的行为模式。这种模式对调用者屏蔽了内部处理细节,使得提交过来的请求一次被链上节点处理,直到成功处理。这种模式下,可以随时的添加或修改处理的请求节点,对处理者的职责进行了更好的划分。

代理实现及测试如下:

/**
 * 责任链父类,结构类似于链表,即类中保留了对下一个链节点的引用。
 * @author dedu
 *
 */
abstract class Handler {
	
	private Handler handler;
	
	/**
	 * 不同的实现者实现不同,但相同点是自己无法处理时,调用下一个链节点进行处理。
	 * @param type 类型
	 */
	public abstract void Handle(int type);

	public Handler getHandler() {
		return handler;
	}

	public void setHandler(Handler handler) {
		this.handler = handler;
	}
}

/**
 * Handler实现者,对范围内的type进行处理
 * @author dedu
 *
 */
public class ConcreteHandler1 extends Handler{
	
	private final int RANGE = 10;

	@Override
	public void Handle(int type) {
		if (type <= RANGE) {
			System.out.println(this.getClass().getSimpleName() + "进行处理,值为:" + type);
		} else {
			if (null != this.getHandler()) {
				this.getHandler().Handle(type);
			}
		}
	}

}
/**
 * Handler实现者,对范围内的type进行处理
 * @author dedu
 *
 */
public class ConcreteHandler2 extends Handler{
	
	private final int RANGE = 50;

	@Override
	public void Handle(int type) {
		if (type <= RANGE) {
			System.out.println(this.getClass().getSimpleName() + "进行处理,值为:" + type);
		} else {
			if (null != this.getHandler()) {
				this.getHandler().Handle(type);
			}
		}
	}

}
/**
 * Handler实现者,对范围内的type进行处理
 * @author dedu
 *
 */
public class ConcreteHandler3 extends Handler{
	
	private final int RANGE = 100;

	@Override
	public void Handle(int type) {
		if (type <= RANGE) {
			System.out.println(this.getClass().getSimpleName() + "进行处理,值为:" + type);
		} else {
			if (null != this.getHandler()) {
				this.getHandler().Handle(type);
			}
		}
	}

}

测试:

public static void main(String[] args) {
		Handler handler1 = new ConcreteHandler1();
		Handler handler2 = new ConcreteHandler2();
		Handler handler3 = new ConcreteHandler3();
		handler1.setHandler(handler2);
		handler2.setHandler(handler3);
		int[] arr = {1,2,30,49,80};
		for (int i : arr) {
			handler1.Handle(i);
		}
	}

常见使用场景:
1 请假流程处理,如老师审批、班主任审批、校长审批。
2 JavaWeb中Servlet的请求处理, Filter和FilterChain的接口。
3 发邮箱时,有很多种不同渠道可以发送,如果一个渠道发送失败,可使用下一个渠道,直到一个渠道发送成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值