设计模式:9、职责链模式

Tomcat保障灵活性和可拓展性的解决方案(Pipeline和Valve)_tomcat灵活性体现在-优快云博客

上文提到职责链模式,本文简单介绍一下职责链模式的实现和作用

目录

0、定义

1、职责链模式的两种角色

2、职责链模式UML类图:

3、示例代码

4、职责链模式的优点

5、适合的使用情景



0、定义

        使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

1、职责链模式的两种角色

  • 处理者(Handler):这是个接口,包含两个方法,分别负责规定具体处理者处理请求的方法和具体处理者的后继对象。
  • 具体处理者(ConcreteHandler):实现处理者Handler接口,在实例化后进行后继对象的注入,在运行时执行具体方法处理用户请求,在方法中,判断是否能够处理,若能则处理,若不能,则交由自己的后继对象进行处理,以此类推,形成链式。

2、职责链模式UML类图:

3、示例代码

处理者:

package xyz.jangle.design.chain;
/**
 * 处理者
 * @author Administrator
 *
 */
public interface Handler {
	
	public void handleRequst();
	
	public void setNextHandler(Handler handler);

}

具体处理者1

package xyz.jangle.design.chain;
/**
 * 具体处理者1
 * @author Administrator
 *
 */
public class ConcreteHandler1 implements Handler {
	
	private Handler handler;

	@Override
	public void handleRequst() {
		if((Math.random()*10) > 5) {	//模拟规则
			System.out.println("Handler1 处理了消息");
		}else {
			if(handler != null)
			handler.handleRequst();	//委托下一个节点处理
		}
	}

	@Override
	public void setNextHandler(Handler handler) {
		
		this.handler = handler;

	}

}

具体处理者2

package xyz.jangle.design.chain;
/**
 * 具体处理者2
 * @author Administrator
 *
 */
public class ConcreteHandler2 implements Handler {
	
	private Handler handler;

	@Override
	public void handleRequst() {
		if((Math.random()*10) > 5) {	//模拟规则
			System.out.println("Handler2 处理了消息");
		}else {
			if(handler != null)
			handler.handleRequst();	//委托下一个节点处理
		}
	}

	@Override
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}

}

客户端(使用)

package xyz.jangle.design.chain;
/**
 * 将2个具体处理者编织成链式,然后请求第一个处理者
 * @author Administrator
 *
 */
public class AppMain9 {

	public static void main(String[] args) {
		ConcreteHandler1 handler1 = new ConcreteHandler1();
		ConcreteHandler2 handler2 = new ConcreteHandler2();
		handler1.setNextHandler(handler2);
		
		handler1.handleRequst();	//请求职责链的第一个对象

	}

}

输出结果

Handler2 处理了消息

4、职责链模式的优点

  • 责任链中的对象只和自己后继对象进行低耦合,不与其他对象进行关联。这使得编写处理对象及创建责任链变得非常容易。
  • 当在处理者中分配职责时,责任链给应用程序更多灵活性。
  • 应用程序可以动态的增加、删除处理者或重新指派处理者的职责。
  • 应用程序可以动态改变处理者之间的顺序。
  • 使用职责链的用户不必知道处理者的信息,用户不会知道到底哪个对象处理了它的请求。

注:此处强调动态,是因为静态的if else if 判断也可以实现职责链的效果,但无法进行动态的调整。

5、适合的使用情景

  • 有许多对象可以处理用户请求,希望程序在运行时自动确定处理用户请求的对象。
  • 希望用户不必明确指定接收者的情况下,向多个接收者中的一个提交请求。
  • 程序希望动态制定可处理用户请求的对象集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值