惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LangChain Blog
W
WeLiveSecurity
P
Proofpoint News Feed
月光博客
月光博客
NISL@THU
NISL@THU
L
LINUX DO - 最新话题
Webroot Blog
Webroot Blog
T
Threatpost
Y
Y Combinator Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Vercel News
Vercel News
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
S
Schneier on Security
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
小众软件
小众软件
MyScale Blog
MyScale Blog
N
News and Events Feed by Topic
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
The Hacker News
The Hacker News
Schneier on Security
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
Recent Announcements
Recent Announcements
S
Security @ Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
T
The Exploit Database - CXSecurity.com
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
雷峰网
雷峰网
量子位
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
I
Intezer
T
The Blog of Author Tim Ferriss
G
GRAHAM CLULEY
D
DataBreaches.Net
V
Vulnerabilities – Threatpost
P
Privacy & Cybersecurity Law Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
罗磊的独立博客

博客园 - GodSpeed

如何开始对项目进行管理(三) 如何开始对项目进行管理(二) 如何开始对项目进行管理(一) 负载均衡随记 ASP.NET应用程序生命周期趣谈(五) IIS7瞎说 ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期 ASP.NET应用程序生命周期趣谈(三) HttpModule ASP.NET应用程序生命周期趣谈(二) ASP.NET应用程序生命周期趣谈(一) C#和sqlserver数字数据类型学习 Office编程(二)C#读取Excel并存入数据库,通过XML自定义表名,是否重建并插入数据 - GodSpeed - 博客园 项目管理读书笔记--Manage it --识别和避免schedule games(9)总结 项目管理读书笔记--Manage it --识别和避免schedule games(8) 项目管理读书笔记--Manage it --识别和避免schedule games(7) 项目管理读书笔记--Manage it --识别和避免schedule games(6) 项目管理读书笔记--Manage it --识别和避免schedule games(5) 项目管理读书笔记--Manage it --识别和避免schedule games(4) 项目管理读书笔记--Manage it --识别和避免schedule games(3) - GodSpeed 项目管理读书笔记--Manage it --识别和避免schedule games(2)
白话设计模式--实践应用--Chain of Responsibility(职责链)和factory模式
GodSpeed · 2009-12-16 · via 博客园 - GodSpeed
很久没有写了,接着来,文笔不好请大家见谅,最终希望能够与志同道合的程序员筒子们共同提高。
关于设计模式,我坚持“有用就学,没用就放”的原则。一种设计模式如果你没有真正使用过,没有用心的在实践中体会,我觉得是很难记得住的。就算记住了,也没办法有效应用。而在学习的过程中,那些经典实例我觉得并不实在(当然只是个人感觉,呵呵),感觉就像作假一样,学的时候很容易就明白了,睡一觉又忘了。为了能加深学习的效果,给大家留下印象,我会在写这些实践型设计模式实例时适当的解释一下业务逻辑,毕竟,软件是用来解决业务问题的,设计模式归根结底还是为了更好的解决业务问题。
今天说的是职责链模式和工厂模式,要说工厂啊 我发现它是用的最广泛的,到哪都用。
马上临近年底了,企业要整理一年的费用,给那些欠费的客户发账单。
在系统中有这样的账单记录:"某客户,年费,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()就可以了,类图如下:
代码简单,就不详细写了。欢迎拍砖交流。