在策略模式一章中,Head Fist一书主要是通过“Duck”的例子,来讲解优化代码,并将策略模式自然而然的融入进去。
本例粗略介绍:有一个制作模拟鸭子游戏(SimUDuck)的公司,他们根据用户的需求去模拟模拟各种鸭子,鸭子的属性有:毛色,鸣叫方式,飞行行为,游泳行为。该公司本来实现的方式:有一个父类:Duck,其中定义了这四种行为,其他的子类继承该父类。其中在父类中毛色(display为抽象方法),子类继承后各自具体实现各自的方法。现在公司要创新业务,增加多种鸭子的种类,那么应该如何去重构代码?
出现的主要矛盾:需要实现的鸭子种类、行为的多样化与当前项目采用继承方式导致的单一化相矛盾。
这时候,第一个设计原则就应运而生了:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
将行为分开放入类中,此类专门提供某行为接口的实现。这样鸭子的类就不再需要知道行为的实现细节。此解决思路遵循的设计原则:针对接口编程,而不是针对实现编程。“针对接口编程”真正的意思是“针对超类型(supertype)编程”。即:传统意义上的抽象类及接口。(应灵活的利用多态去解决问题)。
当将两个类结合起来使用时,这就是组合(composition)。这种做法和“继承”不同的地方在于,鸭子的行为不是继承来的,而是和适当的行为对象“组合”来的。这是一个很重要的技巧。使用了第三个设计原则:多用组合,少用继承。
策略模式的精髓(定义):定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
在程序中应巧妙的使用set方法以起到“在运行时动态地改变行为”的目的。
代码链接:https://coding.net/u/smartchao/p/chaogitrepos/git/tree/master/head-fist
结构图参照课本page22页
当以后再解决问题的时候要注意思维的转变,应先深刻的理解设计原则:面向接口编程而不是面向实现编程。在进行方法的调用时,应面向接口,调用接口的方法,然后再实现接口,用多态去引用具体的实现方法。
在采用该设计模式去写代码时,因为要采用继承超类的方式,因此应先明确类中可能出现的几种方法:一:所有子类均需要实现的方法,而且方法的实现方式一致,举本例来说,所有的鸭子都有游泳的方法,而且所有的鸭子都会游泳。对于这种方法,在超类中直接实现即可。二:每个子类所特有、独一无二的具体的实现方法。因为独一无二,所以不牵涉到方法的复用问题,所以对于这种方法,在超类中去定义一个抽象方法,子类继承抽象方法后再进行实现即可。三:多个子类可能用到的具体的实现的方法。因为多个子类都可能用到,因此牵涉到了方法的复用,而且设计原则:多用组合少用继承。也要求多采用组合的方式,因此最好的解决方案是定义一个公有的接口,再根据具体的要求去实现它。在超类中去引用接口并调用接口中定义的方法。并在此为接口设置setter方法,以便在子类中动态的去设置其具体的行为。
采用通俗易懂的语言去描述这个设计模式的话就是:建立一个抽象超类,参考上一段内容去建立方法及接口以及接口的各个实现类。然后具体子类继承抽象父类。利用多态在调用setter方法时去new具体的接口实现类。整个策略模式就此实现了。