android 源码设计模式读书笔记(六)责任链模式
2019-07-22 本文已影响5人
刘景昌
定义:每个对象都有机会处理请求,从而避免了请求者与接收者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,知道有对象处理他为止。
应用场景:对个对象处理同一个请求,但具体由哪个对象处理在运行时动态决定。
在请求处理者 不明确的情况下向多个对象提交一个请求
需要动态指定一组对象处理请求
责任链模式UML 图
image.png
具体实现 我认为可以用在我们的Vip等级权限设置
我们先具体一个需求:
暂时分两个个等级vip1 vip2 在签到的时候vip1加30记分 vip2 加60分 具体实现UML
image.png
具体实现
两个基类
public abstract class AbstractHandler {
//每个执行的里面都包含下一执行的队形
public AbstractHandler nextHandler;
public final void handleRequest(AbstractRequest abstractRequest){
if(abstractRequest.getVipLevel() == getVipLevel()){
handler(abstractRequest);
}else{
if(nextHandler != null){
nextHandler.handleRequest(abstractRequest);
}else{
System.out.println("这件事情已经无法处理了");
}
}
}
//每个执行类具体的等级
public abstract int getVipLevel();
//每个执行类具体的执行方法
public abstract void handler(AbstractRequest abstractRequest);
}
abstract class AbstractRequest {
private Object object;
public AbstractRequest(Object object) {
this.object = object;
}
public Object getContent(){
return object;
}
public abstract int getVipLevel();
}
具体实现类
public class Vip2Handler extends AbstractHandler {
@Override
public int getVipLevel() {
return 2;
}
@Override
public void handler(AbstractRequest abstractRequest) {
System.out.println("积分+60");
}
}
public class Vip2Request extends AbstractRequest {
public Vip2Request(Object object) {
super(object);
}
@Override
public int getVipLevel() {
return 2;
}
}
调用代码:
AbstractHandler handler1 = new Vip1Handler();
AbstractHandler handler2 = new Vip2Handler();
handler1.nextHandler = handler2;
AbstractRequest request1 =new Vip1Request("vip1");
AbstractRequest request2 =new Vip1Request("vip2");
handler1.handleRequest(request1);
handler1.handleRequest(request2);
优缺点:
1.优点 代码中耦合度低 灵活性高
2.缺点:请求处理中涉及遍历,遍历太多可能会影响性能