也谈设计模式,实例票据打印 解析 Decorator
... 前言
二战期间,"Blue Funnel" 船运公司,需要从美国向英格兰,途径大西洋运送物资。
不幸的是,他们很快就成为德军舰队的主要攻击目标。
公司管理人员也及时意识到,在被攻击的过程中,年轻船员的伤亡比例很大。
于是他们雇佣了一个叫"Kurt Hahn"的人,此人聪明之极,成立了一个至今仍然存在的组织 -- “Outward Bound”。
该组织设立了一门为期28天的课程,专门向年轻船员传授经验 -- 如何结合在学校里学到的知识,在关键时刻更好地利用它们。
实践证明,这门课程能很好地降低年轻船员的伤亡率。
... 软件开发中的设计模式
设计模式,说白了,就是软件开发过程中的一些经验之道。
犹如理解了孙子兵法, 打仗就有可能打得轻松些,漂亮些。
要学习设计模式,最好对一种以上的面向对象的程序语言有深刻的理解。
否则,学习起来不仅痛苦,而且收效甚微。
当然,如果能通过设计模式,反过来学习面向对象程序语言,也许是一种不错的学习方式。
(等有一天,如果我成为了大学教师,我会试一下这种教学模式。我又开始做梦了,呵呵...)
... 如何学习设计模式
学习设计模式,关键是要有好的例子。
有的年轻人会买书;有的人甚至去读英文原版书;
其实大可不必。
打开cnblogs, 输入"设计模式", 会有很多很好的系列文章。认真拜读它们就可以了。
写这些系列的人都是经验丰富的高人,比起书本中的空洞说教要强很多。
... Decorator 模式在票据打印中的应用 -- 抛出问题
这个例子是所有例子中,最能解析Decorator模式的例子。
懂面向对象语言的人一看就清楚,AonTicketPrinter 和 CitiPrintTicket 是两个实体类,用来打印"Aon" 和 “Citi”两个客户的票据主体。
因各自的业务不同,故设计成两个不同的实体类。
客户现在要求,票据主体是必须的,但操作员在打印时,可以有选择性地在票头和票尾加打一些信息。
UI界面可能如下所示:
新手、经验不丰富的人、不懂设计模式的人,包括我自己 ....
使用面向对象设计思想,底层类的设计可能如下所示:
这种设计是恐怖的,是正确和有效的。
有的人会说,为什么不用逻辑判断,而要产生这么多继承类 ?
面向对象设计思想的基本原则是:对扩展开发,对修改封闭。
... Decorator 模式在票据打印中的应用 -- 解决问题 (附上代码)
分析发现,继承类的Printer方法,在任何时候,都调用了base.Print() ,只是在父类方法的基础上,添加了一些功能。
如果发现是这种场景,Decorator 就可以上场了。
这种设计是神奇的,是正确和有效的。
即使未来,增加 10000个新客户,我们要做的工作也是有趣的。毕竟不同的客户,业务总会有点差别。