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

... 前言

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

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

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

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

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

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

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

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

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

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

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

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

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

  ... 如何学习设计模式

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

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

  其实大可不必。

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

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

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

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


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

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

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

UI界面可能如下所示:

 

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

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

 

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

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

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

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

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

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

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

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

 

Design Patter - Decorator Example

Design Patter vs2010 - Decorator Example 

转载于:https://www.cnblogs.com/chinaairforce1/archive/2009/11/10/1599876.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值