设计模式-策略模式(strategy pattern)

1,084 阅读2分钟

需求描述:

  1. 鸭子类(duck)
  2. 多个品种的鸭子(红头鸭,绿毛鸭,玩具鸭)
  3. 多种行为动作(呱呱叫,飞翔,外观展示)

如何设计呢?

普通的设计模式:

  1. duck为父类,定义了呱呱叫 飞翔 外观展示等方法
    public class Duck {
     public String guagua(){
         //呱呱叫
     }
     public String fly(){
         //飞翔
     }
     public String display(){
         //外观展示
     }
    }
  2. 多个品种的鸭子 设计为子类 继承 duck
    public class RedHeadDuck extend Duck{
     //覆写父类的外观方法
     public String display(){
         //我是红头鸭
     }
    }

这么设计问题出现了,所有的鸭子都具有了飞翔和呱呱叫的能力,但是玩具鸭并不具有飞翔的能力

修改设计:

  1. duck仍为父类
    public class Duck {
     public String guagua(){
         //呱呱叫
     }
     public String display(){
         //外观展示
     }
    }
  2. 设计接口 flyBehavior
    public interface FlyBehavior {
     Stirng fly();
    }
    public class FlyDuck extend Duck implements FlyBehavior {
     public String fly(){
         //我会飞翔
     }
    }
    public class ToyDuck extend Duck {
     public String display() {
         //我是一个玩具鸭
     }
    }
    将需要实现飞翔的子类实现接口flyBehavior
    这样只需要玩具鸭不去实现接口就解决了飞翔的问题

但是 问题来了 如果说飞翔又分为 借力飞翔 迎风飞翔 等不同的飞翔方式
实现接口的子类需要 不同的实现方式,代码更多 而且不能够复用

升级设计

  1. duck为父类
  2. 设计接口 flyBehavior
  3. 设计行为类 实现 flyBehavior
  4. duck 中引用 行为类
    public class Duck {
     private FlyBehavior flyBehavior;
     public setFlyBehavior(FlyBehavior f){
         this.flyBehavior = f;
     }
     public String fly(){
         return flyBehavior.fly();
     }
    }
    public class NoFly implements FlyBehavior {
     public String fly () {
         //不能飞翔
     }
    }
    public class CanFly implements FlyBehavior {
     public String fly () {
         //可以飞翔
     }
    }
    //还可以定义多种飞翔方式。。。。
    这样设计就可以很灵活的修改类

结语:策略模式(strategy pattern)
将行为类 即易改变的东西抽取出来
多用组合 少用继承
针对接口编程 不要针对实现编程
原文地址文章参考《head first 设计模式》
未经作者允许 请勿转载,谢谢 :)