Encapsulates an algorithm inside a class separating the selection from the implementation. 定义一系列算法,把它们封装起来,并且可以使它们可以相互替换,最终使得算法可以独立于使用它的客户而变化。
动机:用一个类来封装同类算法。
适用性:当许多相关的类仅仅只是行为有不同;需要使用一个算法的不同变体;算法使用的客户不应该知道数据和结构,用策略模式加以封装;一个类定义了多种行为,并且这些行为需要在这个类的操作中以多个条件语句的形式出现。将相关条件分支移入到它们各自的 Strategy
类中以代替这些条件语句。
一个系统需要动态地在几种算法中选择一种。
结构参考:
class Composition {
private rows: Array<string>;
traverse() {};
repair() {
return this.rows.map(r => r.compose());
};
}
class Composer {}
class MusicComposer extends Composer {
public compose(str: string) {}
}
class MathComposer extends Composer {
public compose(str: string) {}
}
效果:
- 定义了一系列可复用和重用的算法系列。也是一个替代「继承」的方法。
- 有助于消除复杂冗余的条件语句。
- 实现了算法和策略选择。
实战
- 关机功能,Linux / Mac / Win 的策略不同,但是整体可以试一下为多个策略继承同一个关机策略抽象类做调用;