设计模式学习之路--策略模式

来源:互联网 发布:录入查询系统源码 编辑:程序博客网 时间:2024/05/23 15:05

  学习背景

  基于一段时间的开发,感觉日复一日的硬编码,对自己的实力的提高作用很小,只是对之前编码的一个复用,感觉总是在进行一些if else的操作。所以抽个时间来学习一下设计模式相关的东西,看看对自己编码过程中遇到的一些问题能否进行解决和改善现在编码的一些误区。入手了一本设计模式的书籍《head First 设计模式》进行学习。
       我们全都使用别人设计好的库与框架。我们讨论库与框架、利用他们的API编译成我们的程序、享受运用别人的代码带来的有点。看看JAVA API及它所带来的功能:网络 、GUI、IO等。库与框架长久以来,一直扮演着软件开发过程中的重要角色,我们从中挑选所要的组件,把它们放进合适的地方。但是。。。库与框架无法帮助我们将应用组织成容易了解、容易维护、具有弹性的架构,所以我们需要设计模式。

  策略模式介绍

          什么是策略模式呢? 
  为了实现某个功能所用到的算法或者策略。策略模式定义了算法族,把这些算法分别的封装起来,让他们之间可以互相的替换。让算法的变化独立于使用算法的客户。
  策略模式所常用的设计原则当然这也是其他的的模式也会用到的设计原则。
  1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
    把会变化的部分取出来并“封装起来,好让其他部分不会受到影响,这样可以让代码变的更有弹性。
  2、针对接口编程,而不是针对实现编程。
    针对接口编程真正的意思是针对超类型supertype编程。

  根据客户需求来,策略模式来实现其功能

   在次根据head First 设计模式》一书中将到的模拟鸭子的案例来进行分析是如何通过策略模式一步步实现其功能的。
   1、前期需求可能比较的简单例如我们只要求鸭子可以游泳、鸣叫、展示外观等就行。
    我们可能会直接定义一个Duck的超类,所有的鸭子都会游泳和鸣叫Swim、Quack,所以由超类负责处理这部分的的实现代码。,而每个鸭子的子类负责现实自己的display()行为。
这样我怕们也基本上可以实现。
2、现在我们加一个功能,让鸭子飞起来,我们可能会想直接在超类中加一个fly()的抽象方法,然后在子类中继承就可以了。但是这样会造成代码在多个子类中重复,运行时的行为不容易改变,很难知道鸭子的所有行为,改变会牵一发而动全身,造成其他的鸭子不想要的改变
3、下面就考虑用这些设计原则来进行功能的实现。
  1、针对接口编程,而不是针对实现编程
我们可以定义两个接口,FlyBehavior和QuackBehavior,然后针对性实现
这样设计就可以把这些动作完全被复用,而且这些动作已经独立于鸭子了
找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起把会变化的部分取出来并“封装起来,好让其他部分不会受到影响
下面是封装的整体大局观

总结

虽然有的时候继承可以提高代码的复用性,但是后续的需求改变了,也会该我们造成维护上的不便,因此我们要深刻理解和学习运用OO原则,让自己的代码质量更高。不喜勿喷,后续可能会对此进行完善!!!