策略模式

策略模式:定义算法族,封装起来,让算法独立于使用算法的类。

原则:

  1. 封装变化;
  2. 多用组合,少用继承;
  3. 针对接口编程,不针对实现编程。

设计一个模拟鸭子应用,如果不使用策略模式,大致结构是这样的:

只考虑继承的模拟鸭子类图.png

红头鸭、绿头鸭、橡皮鸭、诱饵鸭有共同的父类,它们分别实现自己的 fly() 和 quack() 方法,比如红头呀能叫能飞,橡皮鸭能叫不能飞,诱饵鸭不能飞不能叫……
在这个设计下,每定义一个新的鸭子都要重写这个类下的 fly() 和 quack() 方法,这会导致大量实现 fly() 和 quack() 方法的重复代码,也就是说 fly() 和 quack() 这两个行为和“鸭子类”耦合在了一起。这些代码是容易变化的,要把它们从原来的类中分离出来重新封装(即 1. 封装变化),通过组合而不是继承来与“鸭子类”配合(即 2. 多用组合,少用继承。大多数情况下继承意味着耦合)。然后再根据具体的行为来实现代码(即 3. 针对接口编程)。

使用策略模式后的类图:

策略模式模拟鸭子类图.png

使用策略模式,将 Fly 和 Quack 行为分离出来,封装成一个接口,使用行为类实现分别实现不同的行为。在 Duck 中设置两个实例变量分别引用它们。这样,之后可以更好的应对这部分的变化。在子类化 Duck 时,也可以动态的指定子类的行为。并通过调用 perfrom 方法委托行为类来实现行为。

CPP 的实现:

Duck 类:

class Duck {
public:
  Duck() = default;
  ~Duck();

  FlyBehavior *flyBehavior;
  QuackBehavior *quackBehavior;

  void swim();
  void display();
  void perfromQuack();
  void perfromFly();
  void setFlyBehavior(FlyBehavior *flyBehavior);
  void setQuackBehavior(QuackBehavior *quackBehavior);
};

两个行为接口,CPP 中没有 Java 中的 interface 的概念。使用抽象基类实现:

class FlyBehavior {
public:
  virtual void fly() const = 0;
};

class QuackBehavior {
public:
  virtual void quack() const = 0;
};

定义具体的行为类实现抽象行为基类的接口,Duck 的子类在各自的构造方法中指定自己的行为类。这样策略模式就实现了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是策略模式 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户...
    Zentopia阅读 3,817评论 6 11
  • 定义 定义算法族,分别封装起来,让他们之间可以互相替换,让算法的变换独立于使用算法的用户。 应用 加入某公司已经非...
    东北妞儿阅读 326评论 1 1
  • 设计模式 开题先说明一下,设计模式告诉我们如何组织类和对象以解决某种问题。让代码变得更加优雅是我们责无旁贷的任务 ...
    tanghuailong阅读 468评论 0 2
  • 说起来很惭愧,在学校呆了十来年,掌握了很多的学习方法,但是当静下心来总结一套属于自己的学习方法时,却怎么也没有办法...
    一心小茶馆阅读 726评论 13 22
  • 如今,越来越多的年轻人不愿意打工,转向淘宝创业。有的自己开淘宝店铺,有的做淘宝客,我也是做淘宝的,但是感觉到...
    ii小太阳阅读 318评论 0 0