设计模式之责任链模式

2019-04-04  本文已影响0人  Kevin_小飞象

定义

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

Android 中源码使用责任链模式

特点

使用场景

1.多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
2.在请求处理者不明确的情况下向多个对象中的一个提交请求。
3.需要动态指定一组对象处理请求。

简单实现

公司的报账审批流程,类似我们今天说的责任链模式。

public abstract class Leader {

    public Leader preHandler;  //上级领导

    public final void handleRequest(int money) {
        Log.d("TAG", getLeader());

        if (money <= limit()) {
            handle(money);
        }else {
            Log.d("TAG", "超出我的报账额度,提交上级领导 ");

            if (preHandler != null) {
                preHandler.handleRequest(money);
            }
        }
    }

    public abstract int limit();   //额度

    public abstract void handle(int money); //具体金额

    public abstract String getLeader();  //处理者
}

-----------------------------------------
public class GroupLeader extends Leader {
    @Override
    public int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        Log.d("TAG", "组长批复报销额度为:" + money + "元");
    }

    @Override
    public String getLeader() {
        return "组长";
    }
}

-----------------------------------------
public class Director extends Leader {
    @Override
    public int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        Log.d("TAG", "主管批复报销额度为:" + money + "元");
    }

    @Override
    public String getLeader() {
        return "主管";
    }
}

-----------------------------------------
public class Manager extends Leader {
    @Override
    public int limit() {
        return 10000;
    }

    @Override
    public void handle(int money) {
        Log.d("TAG", "经理批复报销额度为:" + money + "元");
    }

    @Override
    public String getLeader() {
        return "经理";
    }
}

-----------------------------------------
public class Boss extends Leader {
    @Override
    public int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        Log.d("TAG", "老板批复报销额度为:" + money + "元");
    }

    @Override
    public String getLeader() {
        return "老板";
    }
}

使用:

public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       initData();
   }

   private void initData() {
       GroupLeader groupLeader = new GroupLeader();

       Director director = new Director();

       Manager manager = new Manager();

       Boss boss = new Boss();

       groupLeader.preHandler = director;
       director.preHandler = manager;
       manager.preHandler = boss;
       //组长发起报账申请
       groupLeader.handleRequest(8000);
   }
}

输出结果:

2019-04-04 10:25:47 D/TAG: 组长
2019-04-04 10:25:47 D/TAG: 超出我的报账额度,提交上级领导 
2019-04-04 10:25:47 D/TAG: 主管
2019-04-04 10:25:47 D/TAG: 超出我的报账额度,提交上级领导 
2019-04-04 10:25:47 D/TAG: 经理
2019-04-04 10:25:47 D/TAG: 经理批复报销额度为:8000元
上一篇下一篇

猜你喜欢

热点阅读