设计模式-策略模式

来源:互联网 发布:apache工作原理 编辑:程序博客网 时间:2024/05/21 23:35

序:

     写程序第三个年头了,本身不是计算机专业出身,突然发现不懂设计模式,真的无法将个人水平提高。没有设计模式,就如同现代社会突然道了原始社会一般,完全没有了积累。设计模式本身就是多年来,大牛们的经验总结------财富啊。

     前段时间开始接触设计模式,这个文档只是本人的学习感触,或者说个人认为的一些关键问题。

正文:

     首先抛出几个问题:

     1.什么是策略模式,策略模式解决什么问题。

     2.使用策略模式是如何实现的?

     以上两个问题其实可以通过下面几个图的研究得出结论。

     

        通过上面这幅图,我们可能感觉这很熟悉啊,就是C++的继承关系嘛,这在C++的一些书里面全是这。不错,我们在书里看到的都是这货,也是这货害了我们,我们总是情不自禁的就使用了这样的继承。

        那么,我们就谈一下这样的结构有什么缺点呢?举个例子说明啊,比如说现在要给子类添加一个功能,就是飞行(fly),但是不是每个子类的都具有飞行的功能,那么就不能再父类里实现了,下移到子类实现。问题来了,第一,假如说部分子类的飞行是一样的,那么那么我们要写什么重复的代码。第二,每个子类都要实现飞行的函数,添加一个操作导致修改大范围的代码,很是不划算。

        在Java中提到一个比C++中好的一个概念,就是接口(其实两个里面都有,只是C++的初级书籍中从没有谈到,不知道为什么),下面的图就是把飞行的功能提出来,做一个接口,让子类实现。虽然说这样体现了面向对象观点,但是实现起来和上面的图没有什么区别,还是有以上两个问题。

         好了,关键的第三幅图,也就是这篇文档的核心(策略模式)

         先看一下结构:鸭子继承Duck,飞行实现FlyBehavior接口。这里面有一个关键的概念就是Has-A和Is-A

Is-A(是一个)鸭子河Duck的关系就是“是一个”的关系,图中也就是继承关系。

        Has-A(有一个)鸭子和飞行行为是“有一个”关系,可以理解为鸭子有一个行为是飞行行为,图中关系为关联

这样我们在添加新的行为时就不需要在子类中实现了,而是单实现自己的行为,然后在客户的父类中写好处理方法,例如SetFlyBehavior和PerformFly的函数就可以了。这样就大大降低了代码的耦合度。

       回过头来,看文档开始提的连个问题,
       1.什么是策略模式

       策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

      2。策略模式是如何实现的?

       策略模式通过使用组合的关系替代继承关系。

后记:

      设计模式中有个设计原则:多用组合,少用继承。

       我就简单谈一下我的看法,组合的作用是功不可没,他降低了代码的耦合度,将功能集中处理。多使用组合是没有问题的。然而一些C++书籍中提倡多用继承,也好理解,继承的存在定有他的道理,没有继承就失去了抽象概念,没有了抽象还哪里有面向对象思想。

      大家可能会说我你这不是自相矛盾,其实不然,继承和组合都有自己的优缺点,写代码也不一定非用设计模式,比如说写一个几十行很简单的程序,搞了几百行实现设计模式,这岂不是画蛇添足。还有就是设计模式不是固定的,形式也不是唯一的。又有人可能说了,这不是说了一堆废话,看了半天不推荐用。其实不是的,学了不一定用,而是理解他的思想,使自己的眼界更开阔,方法更灵活,一切以解决问题为前提。最后一句话“通过实际情况,选择实现方式”


参考书籍: 

HeadFirst设计模式 

下载地址:http://wx180223.7958.com/down_9618541.html