责任链模式,是处理对象将请求沿着一条链,找到能处理此请求的对象。

责任链模式的例子

下面以数据从数据库取还是从缓存中取为例,代码描述责任链的样子。
全部责任者的父类,继承者实现抽象方法。

public abstract class Handler {// 上一级的责任者private Handler successor;public abstract String handle(Integer docId);/* 责任者的Getter、Setter */public Handler getSuccessor() {return successor;}public void setSuccessor(Handler successor) {this.successor = successor;}}

责任者之一:数据库。编号为1-9的文章由此责任者读取。

import java.util.HashMap;
import java.util.Map;public class DataBaseHandler extends Handler {@Overridepublic String handle(Integer docId) {if (this.getSuccessor() != null) {String result =  this.getSuccessor().handle(docId);if (result != null) {return result;}}Map<Integer, String> map = new HashMap<Integer, String>();for (int i = 1; i <= 9; i++) {map.put(i, "文章" + i);}System.out.println(this.getClass().getName() + " do business.");return map.get(docId);}}

责任者之一:缓存。编号为1-3的文章由此责任者读取。

import java.util.HashMap;
import java.util.Map;public class CacheHandler extends Handler {@Overridepublic String handle(Integer docId) {if (this.getSuccessor() != null) {String result =  this.getSuccessor().handle(docId);if (result != null) {return result;}}Map<Integer, String> map = new HashMap<Integer, String>();for (int i = 1; i <= 3; i++) {map.put(i, "文章" + i);}System.out.println(this.getClass().getName() + " do business.");return map.get(docId);}}

设置他们的责任关系,调用责任者

public class HowToUse {public static void main(String[] args) {Handler dataBaseHandler = new DataBaseHandler();Handler cacheHandler = new CacheHandler();dataBaseHandler.setSuccessor(cacheHandler);System.out.println(dataBaseHandler.handle(3));System.out.println(dataBaseHandler.handle(5));}}

日志如下:

CacheHandler do business.
文章3
CacheHandler do business.
DataBaseHandler do business.
文章5

责任者的例子完毕。

部分重构

下面代码进行部分重构:判断环节进行封装公用,以及入参出参的泛型处理。


public abstract class Handler<I, O> {// 上一级的责任者private Handler<I, O> successor;public abstract O handle(I i);public O handleFacade(I i) {O o = null;if (this.getSuccessor() != null) {o = this.getSuccessor().handleFacade(i);if (o != null) {return o;}}return this.handle(i);}/* 责任者的Getter、Setter */public Handler<I, O> getSuccessor() {return successor;}public void setSuccessor(Handler<I, O> successor) {this.successor = successor;}}
import java.util.HashMap;
import java.util.Map;public class DataBaseHandler extends Handler<Integer, String> {@Overridepublic String handle(Integer docId) {Map<Integer, String> map = new HashMap<Integer, String>();for (int i = 1; i <= 9; i++) {map.put(i, "文章" + i);}System.out.println(this.getClass().getName() + " do business.");return map.get(docId);}}

其他类略。

【设计模式】责任者模式相关推荐

  1. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  2. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  3. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  4. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  5. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  6. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  7. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  8. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  9. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

  10. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

最新文章

  1. Redis源码解析——双向链表
  2. 高昆仑大数定律 中心极限定理
  3. sed用法之批量添加nagios services.cfg监控项
  4. 复数类完整实现 + 四则运算符重载
  5. private static final 修饰符
  6. Linux浏览文件的常用命令
  7. 揭秘视频千倍压缩背后的技术原理之预测技术
  8. javaone_JavaOne 2012:JavaOne技术主题演讲
  9. html怎么导入js编辑,three.js怎么导入html
  10. 【Level 08】U06 Good Feeling L3 Fun-filled concert
  11. python实现链表的删除_干货||链表的技巧和算法总结
  12. solid 设计原则 php,面向对象设计SOLID五大原则
  13. CF573E Bear and Bowling 贪心、分块、凸包
  14. Microsoft SQL Server 2008详细安装步骤
  15. java使用hdf.jar_在HDFView 2.14上查看使用h5py编写的大(12.5GB)HDF5文件
  16. 论基于架构的软件设计方法及应用
  17. Linux驱动开发|音频驱动
  18. 人工神经网络—神经元的数学模型
  19. 论文阅读 (四):MILIS: Multiple Instance Learning with Instance Selection.
  20. java web架构配置_javaweb(1) tomcat配置和web程序结构

热门文章

  1. 科研人必备的学术导航,不看后悔!
  2. mysql udf禁用_Mysql数据库UDF的安全问题利用
  3. js 返回上一页面_构建大型 Vue.js 项目的10条建议
  4. ZYNQ7000-GPIO EMIO中断实验 程序烧写后自动进一次中断的怪现象
  5. Java 8 forEach 示例
  6. 电路 | 抗干扰技术
  7. C语言 | 基于STM32的IIC代码实现(源代码)
  8. 温州大学瓯江学院 计算机院赛,温州大学
  9. html表单显示提示,html侧栏对应表单的提示显示
  10. linux内核优化哪些参数,linux内核参数优化 互联网技术圈 互联网技术圈