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

本文通过一个具体的业务场景——处理客户的付款记录,介绍了如何运用职责链模式和工厂模式解决问题。设计了抽象的Poster类及具体实现类如YearlyCostPoster和WorkOrderPoster,采用工厂模式创建这些Poster实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久没有写了,接着来,文笔不好请大家见谅,最终希望能够与志同道合的程序员筒子们共同提高。
 
关于设计模式,我坚持“有用就学,没用就放”的原则。一种设计模式如果你没有真正使用过,没有用心的在实践中体会,我觉得是很难记得住的。就算记住了,也没办法有效应用。而在学习的过程中,那些经典实例我觉得并不实在(当然只是个人感觉,呵呵),感觉就像作假一样,学的时候很容易就明白了,睡一觉又忘了。为了能加深学习的效果,给大家留下印象,我会在写这些实践型设计模式实例时适当的解释一下业务逻辑,毕竟,软件是用来解决业务问题的,设计模式归根结底还是为了更好的解决业务问题。
 
今天说的是职责链模式和工厂模式,要说工厂啊 我发现它是用的最广泛的,到哪都用。
马上临近年底了,企业要整理一年的费用,给那些欠费的客户发账单。
在系统中有这样的账单记录:"某客户,年费,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值