1. 扩展

功能链:某个链处理完继续向下传递。

public class SaleModel {//销售的商品 private String goods;public String getGoods() {return goods;}public void setGoods(String goods) {this.goods = goods;}  public String toString(){return "商品名称="+goods+",销售数量="+saleNum;}
}public abstract class SaleHandler {//持有下一个处理请求的对象 protected SaleHandler successor = null;//设置下一个处理请求的对象 public void setSuccessor(SaleHandler successor){this.successor = successor;}//处理保存销售信息的请求 public abstract boolean sale(String user,String customer,SaleModel saleModel);
}public class SaleDataCheck extends SaleHandler{public boolean sale(String user, String customer, SaleModel saleModel) {//进行数据通用检查,稍麻烦点,每个数据都要检测if(user==null || user.trim().length()==0){System.out.println("申请人不能为空");return false;}if(customer==null || customer.trim().length()==0){System.out.println("客户不能为空");return false;}if(saleModel==null ){System.out.println("销售商品的数据不能为空");return false;}if(saleModel.getGoods()==null ||saleModel.getGoods().trim().length()==0){System.out.println("销售的商品不能为空");return false;}if(saleModel.getSaleNum()==0){System.out.println("销售商品的数量不能为0");return false;}       //如果通过了上面的检测,那就向下继续执行return this.successor.sale(user, customer, saleModel);}
}public class SaleSecurityCheck extends SaleHandler{...
}public class SaleLogicCheck extends SaleHandler{...
}public class GoodsSaleEbo {/*** 保存销售信息,本来销售数据应该是多条,太麻烦了,为了演示,简单点* @param user 操作人员* @param customer 客户* @param saleModel 销售数据* @return 是否保存成功*/public boolean sale(String user,String customer,SaleModel saleModel){//如果全部在这里处理,基本的顺序是//1:权限检查//2:通用数据检查(这个也可能在表现层已经作过了)//3:数据逻辑校验//4:真正的业务处理//但是现在通过功能链来做,这里就主要负责构建链SaleSecurityCheck ssc = new SaleSecurityCheck();SaleDataCheck sdc = new SaleDataCheck();SaleLogicCheck slc = new SaleLogicCheck();SaleMgr sd = new SaleMgr();ssc.setSuccessor(sdc);sdc.setSuccessor(slc);slc.setSuccessor(sd);//向链上的第一个对象发出处理的请求return ssc.sale(user, customer, saleModel);}
}public class Client {public static void main(String[] args) {//创建业务对象GoodsSaleEbo ebo = new GoodsSaleEbo();//准备测试数据SaleModel saleModel = new SaleModel();saleModel.setGoods("张学友怀旧经典");saleModel.setSaleNum(10);//调用业务功能ebo.sale("小李", "张三", saleModel);ebo.sale("小张", "李四", saleModel);}
}

2. 总结
2.1 优点

  • 请求者和接收者松散耦合
    在职责链模式中,请求者并不知道接收者是谁,也不知道具体如何处理,请求者只是负责向职责链发出请求就可以了。而每个职责对象也不用管请求者或者是其他的职责对象,只负责处理自己的部分,其他的就交给其他的职责对象去处理。也就是说,请求者和接收者是完全解耦的。
  • 动态组合职责
    职责链模式会把功能处理分散到单独的职责对象中,然后在使用的时候,可以动态组合职责形成职责链,从而可以灵活地给对象分配职责,也可以灵活地实现和改变对象的职责。

2.2缺点

  • 产生很多细粒度对象
    职责链模式会把功能处理分散到单独的职责对象中,也就是每个职责对象只处理一个方面的功能,要把整个业务处理完,需要很多职责对象的组合,这样会产生大量的细粒度职责对象。不一定能被处理

2.3 职责链模式的本质:分离职责,动态组合。

《研磨设计模式》chap23 职责链模式chainOfResponsibility(3)功能扩展+总结相关推荐

  1. 【设计模式】—— 职责链模式ChainOfResponsibility

    模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...

  2. 《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介

    场景:申请经费,有好几个领导审批,项目经理.部门经理.总经理,最后总会有一个人回复审批结果. 1. 正常编码 public class FeeRequest {//提交聚餐费用申请给项目经理 publ ...

  3. 《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景

    1. 初步实现 public abstract class Handler {//持有下一个处理请求的对象 protected Handler successor = null;//设置下一个处理请求 ...

  4. python设计模式案例分析_Python设计模式之职责链模式原理与用法实例分析

    本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接 ...

  5. 设计模式之职责链模式应用例题

    设计模式之职责链模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军 ...

  6. 【设计模式】职责链模式(C#)

    [设计模式]职责链模式 1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假或者加薪,可处理的领导有HR.部门负责人.副总经理. ...

  7. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 设计模式之职责链模式、减小了因为分支带来的耦合

    1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  9. 设计模式复习-职责链模式

    #pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...

最新文章

  1. 中国AI登上Nature子刊:看病历分析儿科疾病,准确率90%,超人类医师
  2. 想做程序员却不知从何下手?新手入门信息打包送你!
  3. ASCII码对照表(不可见字符)
  4. 华为ax3怎么接光纤sc接口_视频监控工程中使用光纤光缆注意事项有哪些?
  5. 使用web worker和webassembly技术
  6. d3.js实现隐藏部分关系
  7. 获取组件的方式(方法)
  8. java set集合转数组_java set转list,数组与list的转换
  9. 学习 | 雷军 1994 年写的代码,不服不行
  10. UML交互图——鲁棒图的三元素:抽象对象,实体对象和控制对象
  11. main函数结束后的调用
  12. 使用Tensorflow进行脸部识别
  13. linux下编译C++文件基本命令
  14. Android edittext 属性inputtype
  15. 关于工作后定居城市的思考以及房价预测(天涯原创)
  16. Swift网络请求框架Moya的使用
  17. 数据结构(Java)-树-堆排序的实现
  18. 开源软电话 (Open Source Soft Phones)
  19. 名键风流 十六款斐尔可顶级机械键盘赏
  20. 续篇( 一) TCP 为什么是三次握手,四次挥手?

热门文章

  1. 第九届蓝桥杯java B组—第二题方格计数(详细介绍)
  2. matlab bs2rv.m,Matlab智能算法之遗传算法(一)
  3. idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理
  4. 工商银行:IT新架构及银行IT架构转型思考
  5. 数据中心冷热空气流控制优化方案
  6. 数据中心实现高效运维的秘诀
  7. Java:Java的jar包之POI的简介、安装、使用方法(基于POI将Word、Excel、PPT转换为html)之详细攻略
  8. Excel:利用Excel内置功能实现对某列表格按照条件进行升降序排列
  9. Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
  10. Java编程思想:擦除的神秘之处