很久没有写了,接着来,文笔不好请大家见谅,最终希望能够与志同道合的程序员筒子们共同提高。
关于设计模式,我坚持“有用就学,没用就放”的原则。一种设计模式如果你没有真正使用过,没有用心的在实践中体会,我觉得是很难记得住的。就算记住了,也没办法有效应用。而在学习的过程中,那些经典实例我觉得并不实在(当然只是个人感觉,呵呵),感觉就像作假一样,学的时候很容易就明白了,睡一觉又忘了。为了能加深学习的效果,给大家留下印象,我会在写这些实践型设计模式实例时适当的解释一下业务逻辑,毕竟,软件是用来解决业务问题的,设计模式归根结底还是为了更好的解决业务问题。
今天说的是职责链模式和工厂模式,要说工厂啊 我发现它是用的最广泛的,到哪都用。
马上临近年底了,企业要整理一年的费用,给那些欠费的客户发账单。
在系统中有这样的账单记录:"某客户,年费,30元,未付"。
还有这样的工作单: 某客户,除草,20元,未付,等待付款。
还有其他类型的记录,都是依赖于费用,有了费用才能开始干活。那么,当客户付了钱以后,系统就要根据客户付钱的类型,回去找那个针对这次付款的工作(开始它,或者记录已付,或者结束它等等,依赖于真实业务逻辑)。在这里,如果客户付了30元年费,则就找针对年费那个poster,把记录改成"某客户,年费,30元,已付"。 如果客户付了20元的除草费用,则找针对除草那个poster,把记录改成"某客户,除草,20元,已付,进行中",并打印出工作单。根据业务,我们设想是用职责链模式解决这个问题。当客户付钱以后,做一个post动作。开始遍历所有的poster,根据付费类型,找到相应的poster处理,如果找不到,最后进入一个default poster来进行默认处理。
那怎么设计的呢?首先,我们建立一个抽象的poster,所有的专门处理问题的poster都继承自这个抽象类:
它包含一个Post类型的指针nextPoster,指向下一个poster;
一个抽象方法Post(Receipt receipt),传进来一个付款单,没有实现;
一个bool型hasNext指针,表明是否有下一个poster;
默认构造函数中设置hasNext=false;
构造函数Poster(Poster p)中nextPoster=p,hasNext=true。
再构建两个poster,YearlyCostPoster和WorkOrderPoster.
这两个poster分别实现poster抽象类,并分别是用两个构造函数:一个是默认构造函数,另外一个指向基类构造函数。在实现post方法时,伪码如下:
if 是当前类型的费用 then  处理
else if hasNext=true then nextPoster.Post(receipt)。
再构建一个defaultPoster,这里我们什么都不做就可以了。
我们是用工厂来创建poster,则需要再建立一个poster工厂PosterFactory, 在工厂中,我们构建一个静态构造函数GetPoster来返回一个poster,简略代码如下:
DefaultPoster defaultPoster = new DefaultPoster( );
   YearlyCostPoster yearlyCostPoster= new YearlyCostPoster (defaultPoster);
   WorkOrderPoster woPoster= new WorkOrderPoster (yearlyCostPoster);
return poster;
这样,在receipt中定义个抽象的poster,并在构造函数中是用posterFactory.GetPoster()得到需要用的poster。在收到一个付款单以后调用receipt.Post()就可以了,类图如下:
代码简单,就不详细写了。欢迎拍砖交流。

转载于:https://www.cnblogs.com/GodSpeed/archive/2009/12/16/1625609.html

白话设计模式--实践应用--Chain of Responsibility(职责链)和factory模式相关推荐

  1. 22.Chain of Responsibility(职责链)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Chain of Responsibility(职责链)模式动机 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个 ...

  2. 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)

    概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...

  3. 设计模式之略见一斑(Chain of Responsibility责任链模式)

    设计模式 写道 面向对象开发人员通常希望明确和减少对象间的责任,从而降低对象之间的耦合程序.这样我们的系统更加容易修改,同时也可降低产生缺陷的风险.从某种程度上说,java语言本身能够帮助降低对象间的 ...

  4. 职责链模式 php,php Chain of Responsibility 职责链模式

    //被*攻击的接口 interface NuclearAttacked { //处理被*攻击的方法,参数为投放点的x和y坐标 public function NuclearAttacked($x, $ ...

  5. java23中设计模式——行为模式——Chain of Responsibility(职责链)

    2019独角兽企业重金招聘Python工程师标准>>> 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用. ...

  6. 设计模式C++实现(14)——职责链模式

    职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.其思想很简单,考虑员工要求加薪.公司的管理者 ...

  7. Chain of Responsibility(责任链模式) 行为型

    责任链模式 一.概述 二.结构 三.适用场景 四.优缺点 五.实例 一.概述 描述:如组长不能处理的金额,需要向经理请求,经理不能请求的需要向老板请求,这样就现成了一条链,每个级别都能处理这金额.而不 ...

  8. 设计模式(一)Chain Of Responsibility责任链模式

    设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser {S ...

  9. Chain of Responsibility -- 责任链模式

    在软件构建构成中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接收者,如果显示指定,将必不可少地带来请求发送者与接收者的紧密耦合.COR(Chain of Reposibility)设计 ...

  10. Chain of Responsibility 责任链模式 MD

    责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...

最新文章

  1. Spark _29_SparkStreaming初始
  2. 使用ABAP绘制可伸缩矢量图
  3. 有关linux用户和用户组管理的知识详解
  4. UI设计干货素材|网页设计巧妙使用背景纹理
  5. 从分析性数据库ADS中导出数据
  6. Android 下拉刷新库,这一个就够了!
  7. 数据库中字段为CLOB的属性,在Java实体类中将CLOB转化为String
  8. atitit.《金刚经》与it软件项目管理的启发 读后感attilax
  9. c语言代码99乘法表,c语言九九乘法表代码如何写
  10. 自学 Java 怎么入门?
  11. android电容触摸屏的驱动及其上层工作原理,电容触摸屏驱动原理
  12. CRAFT字符检测算法和SynthText合成文本数据集
  13. 电商战决胜在物流 聚美优品破瓶颈发展
  14. 八年级上学期计算机教学计划,第一学期七八年级信息技术教学计划
  15. Appfuse创建网站访问慢的问题
  16. Ceph mimic
  17. 【实验5】——波束形成技术
  18. 近年央行历次利率及准备金率调整对股市影响一览
  19. idea中把 特定文件 或 文件夹 从 git 版本控制中脱离出来
  20. 一个很大的select 下拉框,朝阳区的村

热门文章

  1. 同是共享内存,shm_open与shmget有什么差异?
  2. 身高回归现象是否真的存在?
  3. 仓库选址(排序不等式)
  4. 集群ddos_《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
  5. 软件测试c语言笔试题目,软件测试笔试题库及答案.docx
  6. C++中的explicit、implicit关键字
  7. 计算机系统基本组成教学设计,《计算机系统的基本组成》教学设计.pdf
  8. mysql pheonix hbase,mybatis连接phoenix操作hbase
  9. centos php7.0 mysql,如何在centos7.3系统下安装php7.0
  10. c语言生成1 100随机数求和,c语言 产生1~100随机数,输入一个数字,和第x个随机数一致的话,计算1~x个随机数的和...