第一个设计模式:策略模式(组合模式)

第一个设计模式:策略模式(组合模式)_第1张图片第一个设计模式:策略模式(组合模式)_第2张图片     策略模式,应该是也称为组合模式,定义算法族,分别封装起来,让它们可以相互替换。概念很难理解,我理解的策略模式大约就是,把不会变化或者一定会变化的特征放在一起作为超类,把变化只有很少几种的特征,把每个特征设计成一个接口,针对每个接口写出每种变化的实现类。在具体的实现类中,继承超类,同时在超类中包含特征接口,在具体的实现类中通过接口的多态,动态指定接口的具体实现。画一个示例图如下


     在《Head First设计模式》中,提到的例子程序是鸭子。首先鸭子有三个行为,叫、飞、外观。其中“叫”分为三种“呱呱叫”、“吱吱叫”和“不叫”,”飞”分为两种“用翅膀飞”和“不会飞”,”外观”就是各种各样的了。如果在超类中把三个行为都定义,我们就需要在重新一个鸭子的时候对三个方法都进行重写,但是这里的“叫”和“飞”有一个特点,它的定义只有两种,如果我们把这两种都定义了,以后只需要用到就行了。但是Java是单继承,不能同时继承超类和“叫、飞”的实现类。

      “叫”和“飞”的行为只有有限的几种变化特征,“外观”每种鸭子都是不一样的,每种鸭子都要重写。

      首先,我的思路是,在超类的基础上再写几个类,比如鸭子“用翅膀飞”、“呱呱叫”的类,鸭子“用翅膀飞”、“吱吱叫”的类等等,针对有限的几种特征写出每一个类。这样有一个很明显的不足点。就是目前鸭子只有两个特征“飞”和“叫”,合起来要写3*2=6种继承类,如果特征再多一点,实现类是相乘的增加,会需要些很多的实现类。

     组合模式的思路是,把特征“飞”定义成接口,“用翅膀飞”和“不会飞”是“飞”接口的两个实现类,特征“叫”也是类似的。在超类中,有三个属性,接口“飞”、接口“叫”和抽象类“外观”。在具体的鸭子实现类中,对属性“飞”和“叫”进行具体的实现赋值,如果鸭子是“用翅膀飞”就(接口“飞” = new “用翅膀飞”),把变化的特征交给属性的接口来写。

      这样做的好处就是,后期需要“飞”添加变化“用火箭飞”,都可以很轻易的改变一点点就可以实现。

      组合模式把有限变化的特征提出来,单独成接口,然后把该接口作为超类的属性,在实现类中通过多态选择具体的实现方法。设计模式的原则是 多用组合少用继承、针对接口编程。

      所有的组合模式感想就这些了,以后有新的想法再添加。


你可能感兴趣的:(设计模式学习)