责任链模式

责任链模式定义如下:
使得多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。
将这些对象连城一条链子,并且沿着这个条链子传递该请求,知道有对象处理它为止。

例子: 用户注册时,普通用户和vip用户注册采用不同的方式,因此需要不同处理者进行处理。

此模式重点是“链”
通用类图如下:

Handler:多个处理者的抽象类  抽象处理者
CommonRegisterv、VIPRegisterv:普通和vip注册用户  具体处理者
RegistevAction :注册具体内容

例子如下:


public abstract class Handler {

	protected static final int  level1= 1;
	protected static final int level2 = 2;
	
	private Handler nextHhandler;

	private int level;

	public Handler(int level) {
		this.level = level;
	}

	public final void handleReuest(RegistevAction registevAction) {
		if (this.level == registevAction.getRegisterLevel()) {
			this.response(registevAction);
		} else if (this.nextHhandler != null) {
			this.nextHhandler.handleReuest(registevAction);
		} else {
			System.out.println("此路不通...");
		}
	}

	protected void setNext(Handler handler) {
		this.nextHhandler = handler;
	}

	protected abstract void response(RegistevAction registevAction);
}



public class CommonRegisterv extends Handler {

	
	public CommonRegisterv() {
		super(Handler.level1);
	}

	
	public void response(RegistevAction registevAction){
		registevAction.registerContent();
		System.out.println("这里是普通注册通道,通过 ...");
	}
}


public class VIPRegisterv extends Handler {

	public VIPRegisterv() {
		super(Handler.level2);
	}

	public void response(RegistevAction registevAction){
		registevAction.registerContent();
		System.out.println("这里是VIP注册通道:通过...");
	}
	
}


public class RegistevAction {

	private  int registerLevel;
	
	private String registerContent;
	
	public RegistevAction(int registerLevel, String registerContent){
		this.registerLevel = registerLevel;
		this.registerContent = registerContent;
	}
	
	public int getRegisterLevel(){
		return registerLevel;
	}
	
	public void  registerContent(){
		System.out.println("注册内容:registerLevel:" + registerLevel+",  registerContent:" + registerContent +"!");
	}
}


public class Main {

	private static final String CONTENT1 = "我是普通用户,我要注册...";
	private static final String CONTENT2 = "我是VIP用户,我要注册...";
	private static final String CONTENT3 = "我是路过打酱油的...";
	
	public static void main(String[] args) {

		Handler commonReg = new CommonRegisterv();
		Handler vipReg = new VIPRegisterv();
		commonReg.setNext(vipReg);
	
		List<RegistevAction> intArr = new ArrayList<>();
		intArr.add(new RegistevAction(1,CONTENT1));
		intArr.add(new RegistevAction(2,CONTENT2));
		intArr.add(new RegistevAction(2,CONTENT2));
		intArr.add(new RegistevAction(1,CONTENT1));
		intArr.add(new RegistevAction(3,CONTENT3));
		intArr.add(new RegistevAction(2,CONTENT2));
		
		for(RegistevAction registevAction : intArr){
			commonReg.handleReuest(registevAction);
		}
		
	}

}

结果如下:

注册内容:registerLevel:1,  registerContent:我是普通用户,我要注册...!
这里是普通注册通道,通过 ...
注册内容:registerLevel:2,  registerContent:我是VIP用户,我要注册...!
这里是VIP注册通道:通过...
注册内容:registerLevel:2,  registerContent:我是VIP用户,我要注册...!
这里是VIP注册通道:通过...
注册内容:registerLevel:1,  registerContent:我是普通用户,我要注册...!
这里是普通注册通道,通过 ...
此路不通...
注册内容:registerLevel:2,  registerContent:我是VIP用户,我要注册...!
这里是VIP注册通道:通过...

分析:
这个例子中,抽象的处理者Handler主要有三个职责:
1. 定义一个请求的处理方法handleReuest,这是一个唯一对外开发的接口,其中final表示,此方法不可以被覆盖
2. 定义一个链的排列方式setNext,也就是这个下一个处理者
3. 定义请求的具体实现response
可以看到,其实责任链模式和递归很像...

优点:实现请求和处理分开
缺点:链子较长时,存在性能问题

 

参考文献《设计模式之禅》

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值