白话设计模式--实践应用--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()就可以了,类图如下:
代码简单,就不详细写了。欢迎拍砖交流。
专注于企业级软件开发,做对
客户有用的软件。