责任链模式的简单使用
来源:互联网 发布:淘宝美工面试作品 编辑:程序博客网 时间:2024/06/08 17:53
前言
责任链模式自如其名,就是谁的责任谁来处理这个问题,但是对于这件问题只有一个请求入口,逐个传递达到结束请求的目的。其结构很像生活中的铁链,由一个个小的椭圆形的圆环相连,将每一个圆环看做一个对象,每一个对象都拥有不同的处理逻辑,首端发出请求,这些对象就会按需求来看谁满足处理这个请求的能力,沿着这个链结构逐个传递,最终解决问题。如果还不形象,我就举一个例子,你找领导报销10000元出差补助,你找了你的直接领导就是部门经理,然后部门经理又只能报销2000以内,然后部门经理拿着你的报销单就去找总监,总监又只能报销5000以下,总监再去找经理,然后报销通过了,这一个过程就阐述了这个模式。
使用场景
1,多个对象处理一类请求,但是请求到底是由那个对象来处理由对象本身能力决定。
2,项目中需要指定一组请求处理类。
角色扮演
Handler: 抽象处理类,申明一个处理方法,并保存下一个处理节点。
ConcreteHandler: 具体的处理类,对请求进行处理。
通常情况下,请求类还会进行类似的封装,形成抽象Request类和ConcreteRequest类,这个抽象过程跟Handler完全一样。
Demo
就前言提到的报销问题做一个Demo。首先是抽象类Handler:
package com.demo.iterator;/** * Created by Daybreak on 2017/12/18. */public abstract class Leader{ // 上级领导对于下一个处理节点 protected Leader nextLeader; public Leader(Leader nextLeader){ this.nextLeader = nextLeader; } public final void handlerRequest(int money){ if (money < limit()) { handler(money); }else{ if (nextLeader != null){ nextLeader.handlerRequest(money); } } } /** * 真正处理逻辑 * @param money */ protected abstract void handler(int money); /** * 当前领导的最大权限 * @return */ protected abstract int limit();}
接着我们要定义阶级关系了。
package com.demo.iterator;import android.util.Log;/** * Created by Daybreak on 2017/12/18. */public class GroupLeader extends Leader { // 类名,用于日志区分 public final static String CLASSNAME = GroupLeader.class.getSimpleName(); public GroupLeader(Leader nextLeader) { super(nextLeader); } @Override protected void handler(int money) { Log.e(CLASSNAME,"部门经理爽快的给你报了"); } @Override protected int limit() { return 2000; }}
package com.demo.iterator;import android.util.Log;/** * Created by Daybreak on 2017/12/18. */public class Director extends Leader { public final static String CLASSNAME = Director.class.getSimpleName(); public Director(Leader nextLeader) { super(nextLeader); } @Override protected void handler(int money) { Log.e(CLASSNAME,"总监爽快的报销了"); } @Override protected int limit() { return 5000; }}
package com.demo.iterator;import android.util.Log;/** * Created by Daybreak on 2017/12/18. */public class Manager extends Leader { public final static String CLASSNAME = Manager.class.getSimpleName(); public Manager(Leader nextLeader) { super(nextLeader); } @Override protected void handler(int money) { Log.e(CLASSNAME,"经理给你爽快的报了"); } @Override protected int limit() { return 50000; }}
定义完ConcreteHandler类我们就可以简单的使用了,来吧:
package com.demo.iterator;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import com.example.daybreak.helloword.R;public class ExpenseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_expense); // 列出所有阶级关系 Manager manager = new Manager(null); Director director = new Director(manager); final GroupLeader groupLeader = new GroupLeader(director); findViewById(R.id.account).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { groupLeader.handlerRequest(10000); } }); }}
作为员工报销就找部门经理就行了,其他的就是等待结果了。
后记
Android有很多类似的模式,比如触摸屏幕的监听处理,再比如有序广播的处理。责任链模式请求者只管请求然后坐等结果,这用语言描述就是解耦,这样就提高了代码的灵活性;但是同样处理者太多首先是类文件会多,其次遍历这个链的时间问题,怎么也会影响其性能。
- 责任链模式的简单使用
- 责任链模式的简单实现
- Android的责任链模式
- 浅谈简单工作流设计——责任链模式配合策略与命令模式的实现
- Android的设计模式-责任链模式
- 使用责任链模式过滤字符串
- 使用循环责任链模式会怎样?
- 深入浅出基于Java的责任链模式
- 责任链模式的应用实例
- 责任链模式的理解实例
- 责任链模式-处理双向的消息
- 标准的责任链模式(读书笔记)
- mina中责任链模式的实现
- 责任链模式的c++代码实现
- 责任链模式的实现和理解
- 请求的链式处理---责任链模式
- 责任链模式---遇上对的人
- 我眼中的责任链模式
- python数据挖掘
- Vuejs全家桶系列(三)--- 生命周期和钩子函数
- php debug下载 对应版本
- C语言趣味一百道 第16道 2017_12_18
- ubuntu16.04安装Hadoop及Spark
- 责任链模式的简单使用
- CSS书写规范
- 树莓派3B Linux下设置程序自启动2
- 蓝桥杯ALGO-6安慰奶牛
- 坚持#第245天~正则表达式
- macos 升级high sierra失败之后重启无法正常启动,界面显示一个白色问号的解决办法
- a标签的4个伪类
- angr初探
- 机器学习实战——AdaBoost