也谈设计模式,实例票据打印 解析 Decorator

... 前言

  二战期间,"Blue Funnel" 船运公司,需要从美国向英格兰,途径大西洋运送物资。

不幸的是,他们很快就成为德军舰队的主要攻击目标。

 公司管理人员也及时意识到,在被攻击的过程中,年轻船员的伤亡比例很大。

 于是他们雇佣了一个叫"Kurt Hahn"的人,此人聪明之极,成立了一个至今仍然存在的组织 -- “Outward Bound”。

该组织设立了一门为期28天的课程,专门向年轻船员传授经验 -- 如何结合在学校里学到的知识,在关键时刻更好地利用它们。

  实践证明,这门课程能很好地降低年轻船员的伤亡率。

 ... 软件开发中的设计模式

  设计模式,说白了,就是软件开发过程中的一些经验之道。

犹如理解了孙子兵法,仗就有可能打得轻松些,漂亮些。

  要学习设计模式,最好对一种以上的面向对象的程序语言有深刻的理解。

否则,学习起来不仅痛苦,而且收效甚微。

   当然,如果能通过设计模式,反过来学习面向对象程序语言,也许是一种不错的学习方式。

等有一天,如果我成为了大学教师,我会试一下这种教学模式。我又开始做梦了,呵呵...)

  ... 如何学习设计模式

  学习设计模式,关键是要有好的例子。

  有的年轻人会买书;有的人甚至去读英文原版书;

  其实大可不必。

  打开cnblogs, 输入"设计模式", 会有很多很好的系列文章。认真拜读它们就可以了。

写这些系列的人都是经验丰富的高人,比起书本中的空洞说教要强很多。

 ... Decorator 模式在票据打印中的应用 -- 抛出问题

   这个例子是所有例子中,最能解析Decorator模式的例子。

也谈设计模式,实例票据打印 解析 Decorator_第1张图片

   懂面向对象语言的人一看就清楚,AonTicketPrinter 和 CitiPrintTicket 是两个实体类,用来打印"Aon" 和 “Citi”两个客户的票据主体。

因各自的业务不同,故设计成两个不同的实体类。

  客户现在要求,票据主体是必须的,但操作员在打印时,可以有选择性地在票头和票尾加打一些信息。

UI界面可能如下所示:

 也谈设计模式,实例票据打印 解析 Decorator_第2张图片

  新手、经验不丰富的人、不懂设计模式的人,包括我自己 ....

 使用面向对象设计思想,底层类的设计可能如下所示:

 也谈设计模式,实例票据打印 解析 Decorator_第3张图片

 这种设计是恐怖的,是正确和有效的。

 有的人会说,为什么不用逻辑判断,而要产生这么多继承类 ?

  面向对象设计思想的基本原则是:对扩展开发,对修改封闭。

  ... Decorator 模式在票据打印中的应用 -- 解决问题 (附上代码)

  分析发现,继承类的Printer方法,在任何时候,都调用了base.Print() ,只是在父类方法的基础上,添加了一些功能。

如果发现是这种场景,Decorator 就可以上场了。

   这种设计是神奇的,是正确和有效的。

   即使未来,增加 10000个新客户,我们要做的工作也是有趣的。毕竟不同的客户,业务总会有点差别。

 

也谈设计模式,实例票据打印 解析 Decorator_第4张图片

Design Patter - Decorator Example

Design Patter vs2010 - Decorator Example 

你可能感兴趣的:(Decorator)