白话设计模式--实践应用--Chain of Responsibility(职责链)和factory模式
很久没有写了,接着来,文笔不好请大家见谅,最终希望能够与志同道合的程序员筒子们共同提高。
关于设计模式,我坚持“有用就学,没用就放”的原则。一种设计模式如果你没有真正使用过,没有用心的在实践中体会,我觉得是很难记得住的。就算记住了,也没办法有效应用。而在学习的过程中,那些经典实例我觉得并不实在(当然只是个人感觉,呵呵),感觉就像作假一样,学的时候很容易就明白了,睡一觉又忘了。为了能加深学习的效果,给大家留下印象,我会在写这些实践型设计模式实例时适当的解释一下业务逻辑,毕竟,软件是用来解决业务问题的,设计模式归根结底还是为了更好的解决业务问题。
今天说的是职责链模式和工厂模式,要说工厂啊 我发现它是用的最广泛的,到哪都用。
马上临近年底了,企业要整理一年的费用,给那些欠费的客户发账单。
在系统中有这样的账单记录:"某客户,年费,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模式相关推荐
- 22.Chain of Responsibility(职责链)模式
技术交流QQ群:1027579432,欢迎你的加入! 1.Chain of Responsibility(职责链)模式动机 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个 ...
- 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...
- 设计模式之略见一斑(Chain of Responsibility责任链模式)
设计模式 写道 面向对象开发人员通常希望明确和减少对象间的责任,从而降低对象之间的耦合程序.这样我们的系统更加容易修改,同时也可降低产生缺陷的风险.从某种程度上说,java语言本身能够帮助降低对象间的 ...
- 职责链模式 php,php Chain of Responsibility 职责链模式
//被*攻击的接口 interface NuclearAttacked { //处理被*攻击的方法,参数为投放点的x和y坐标 public function NuclearAttacked($x, $ ...
- java23中设计模式——行为模式——Chain of Responsibility(职责链)
2019独角兽企业重金招聘Python工程师标准>>> 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用. ...
- 设计模式C++实现(14)——职责链模式
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.其思想很简单,考虑员工要求加薪.公司的管理者 ...
- Chain of Responsibility(责任链模式) 行为型
责任链模式 一.概述 二.结构 三.适用场景 四.优缺点 五.实例 一.概述 描述:如组长不能处理的金额,需要向经理请求,经理不能请求的需要向老板请求,这样就现成了一条链,每个级别都能处理这金额.而不 ...
- 设计模式(一)Chain Of Responsibility责任链模式
设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser {S ...
- Chain of Responsibility -- 责任链模式
在软件构建构成中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接收者,如果显示指定,将必不可少地带来请求发送者与接收者的紧密耦合.COR(Chain of Reposibility)设计 ...
- Chain of Responsibility 责任链模式 MD
责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...
最新文章
- Spark _29_SparkStreaming初始
- 使用ABAP绘制可伸缩矢量图
- 有关linux用户和用户组管理的知识详解
- UI设计干货素材|网页设计巧妙使用背景纹理
- 从分析性数据库ADS中导出数据
- Android 下拉刷新库,这一个就够了!
- 数据库中字段为CLOB的属性,在Java实体类中将CLOB转化为String
- atitit.《金刚经》与it软件项目管理的启发 读后感attilax
- c语言代码99乘法表,c语言九九乘法表代码如何写
- 自学 Java 怎么入门?
- android电容触摸屏的驱动及其上层工作原理,电容触摸屏驱动原理
- CRAFT字符检测算法和SynthText合成文本数据集
- 电商战决胜在物流 聚美优品破瓶颈发展
- 八年级上学期计算机教学计划,第一学期七八年级信息技术教学计划
- Appfuse创建网站访问慢的问题
- Ceph mimic
- 【实验5】——波束形成技术
- 近年央行历次利率及准备金率调整对股市影响一览
- idea中把 特定文件 或 文件夹 从 git 版本控制中脱离出来
- 一个很大的select 下拉框,朝阳区的村
热门文章
- 同是共享内存,shm_open与shmget有什么差异?
- 身高回归现象是否真的存在?
- 仓库选址(排序不等式)
- 集群ddos_《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
- 软件测试c语言笔试题目,软件测试笔试题库及答案.docx
- C++中的explicit、implicit关键字
- 计算机系统基本组成教学设计,《计算机系统的基本组成》教学设计.pdf
- mysql pheonix hbase,mybatis连接phoenix操作hbase
- centos php7.0 mysql,如何在centos7.3系统下安装php7.0
- c语言生成1 100随机数求和,c语言 产生1~100随机数,输入一个数字,和第x个随机数一致的话,计算1~x个随机数的和...