Encapsulates an algorithm inside a class separating the selection from the implementation. 定义一系列算法,把它们封装起来,并且可以使它们可以相互替换,最终使得算法可以独立于使用它的客户而变化。


动机:用一个类来封装同类算法。

适用性:当许多相关的类仅仅只是行为有不同;需要使用一个算法的不同变体;算法使用的客户不应该知道数据和结构,用策略模式加以封装;一个类定义了多种行为,并且这些行为需要在这个类的操作中以多个条件语句的形式出现。将相关条件分支移入到它们各自的 Strategy 类中以代替这些条件语句。

一个系统需要动态地在几种算法中选择一种。


结构参考:

  1. class Composition {
  2. private rows: Array<string>;
  3. traverse() {};
  4. repair() {
  5. return this.rows.map(r => r.compose());
  6. };
  7. }
  8. class Composer {}
  9. class MusicComposer extends Composer {
  10. public compose(str: string) {}
  11. }
  12. class MathComposer extends Composer {
  13. public compose(str: string) {}
  14. }

效果:

  • 定义了一系列可复用和重用的算法系列。也是一个替代「继承」的方法。
  • 有助于消除复杂冗余的条件语句。
  • 实现了算法和策略选择。

实战

  • 关机功能,Linux / Mac / Win 的策略不同,但是整体可以试一下为多个策略继承同一个关机策略抽象类做调用;