首页 > 其他 > 详细

设计模式学习一之策略模式1

时间:2015-09-28 00:10:19      阅读:214      评论:0      收藏:0      [点我收藏+]

    什么是模式,模式是一种经验,一种设计良好的面向对象的程序的经验。

    在软件开发中,面向对象语言的出现相对面向过程有一个质的提升,谈及面向对象,最基础的莫过于,封装、继承、多态。

    我现在的理解,封装-就是把变化的东西给抽象出来;继承-实现复用,但会带来很多缺点;多态,父类引用指向子类对象。

    如何用这几种主要特性设计出良好的面向对象程序来,运用前人的经验是很重要的,设计模式就是其中一种。

第一个,策略模式。以下所谈都为Head First 设计模式一书。

    策略模式,定义一个算法族,包含许多算法,把变化的东西封装成算法,它们之间可以互相替换,算法族组成的变化不会影响使用算法的客户。

    其中包含的OO原则有按照接口编程,而不是针对实现编程;把变化的东西封装起来;多用组合,少用继承。谈起来还是太抽象,书中引入了一个例子。

    公司做了一个鸭子游戏,鸭子首先会游泳,可能会叫,这是最初的版本。随着公司的成长,鸭子可能还需要会飞。

怎么办?本来的鸭子结构,我们的设计是Duck是一个父类,拥有swim和display方法,其它各种各样的鸭子去继承这个父类,于是所有的鸭子都有了swim方法和display方法。在鸭子同质化很严重的情况下,这很可行。但是一旦鸭子需要做个性化之后,怎么办?

    比如引入飞的动作,是在Duck父类中引入,还是在子类中为特定需要飞的鸭子增加方法。考虑第二种情况,在运行时动态改变鸭子的行为,比如一只模型鸭,初期可以游泳,但是在后期,对模型鸭进行改造,竟然可以用火箭飞行。面对这样的情况,应该怎样去设计这个程序呢?

    前人给了我们一个经验,设计模式之策略模式。鸭子有很多,动作有很多,但是鸭子也有不变的,这里为了方便说明,比如我们强制要求鸭子必须要会游泳,必须要有display这个方法(展示外貌)。还有叫,飞,等方法。但是在这里注意,叫和飞是组合类型的,比如有一种鸭子会叫但是不会飞,有种鸭子会吱吱叫也会飞,等等。可以扩展出很多。这里我们把变化的东西找出来,那就飞和叫,于是我们把它封装起来,不要Duck类来做这个,用两个接口flyable和quakeable,外加多个实现了flyable和quakeable接口的实现类比如flywithwing类和quakeloudly类等。具体的鸭子类当然必须继承鸭子类,但是同时定义了flyable和quakeable接口的引用,在构造函数中new出来具体的实现类。考虑运行时动态改变鸭子的行为,增加setFlyableWay方法,使引用指向其它的对象,比如在调用这个方法的时候传入一个新的飞行方法对象出来。于是我们可以看到,真的可以动态改变鸭子的行为。

    在上面这个解决方法中。针对接口编程-接口引用,而不是像开始的针对实现编程,针对接口编程,设计两个飞和叫的接口。多用组合,少用继承,飞行和叫的方法,我们不是继承出来的,而是通过接口引用的对象得到的,组合了两个接口。把变化的东西封装起来,用行为类来支撑。什么是行为类,那就是上面这些具体实现飞和叫的方法了。

设计模式学习一之策略模式1

原文:http://www.cnblogs.com/likeshu/p/4842942.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!