设计模式总结:策略模式
策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使得它们可以相互替换,且算法的变化不会影响使用算法的客户端。策略模式使得算法可以在不影响客户端的情况下发生变化。
策略模式的关键组成部分:
策略接口(Strategy):
- 定义所有支持的算法的公共接口。这是所有具体策略类的共同接口,因此可以在客户端中统一使用具体的策略。
具体策略类(Concrete Strategies):
- 实现策略接口的具体类,每个类封装了一个实现特定算法或行为的细节。
上下文类(Context):
- 拥有一个策略对象的引用,并且可以使用它来执行具体策略的行为。上下文可以根据需要在运行时更换策略对象。
策略模式的优点:
- 开放封闭原则:可以在不修改上下文类的情况下引入新策略。
- 避免条件语句:通过使用策略模式,可以消除算法选择时在客户端代码中使用的条件语句。
- 增加灵活性:可以动态更改对象的行为。
策略模式的缺点:
- 增加复杂性:引入过多的策略类可能导致系统复杂性增加。
- 客户端需要了解不同的策略:客户端需要知道使用哪些策略适合在不同情况下。
举个例子:
假设我们正在开发一个文本编辑器,并希望通过不同的方式对文本进行格式化。我们可以使用策略模式来设计这个功能。
// 策略接口
interface TextFormatter {
void format(String text);
}
// 具体策略类
class PlainTextFormatter implements TextFormatter {
public void format(String text) {
System.out.println("Plain text: " + text);
}
}
class HtmlTextFormatter implements TextFormatter {
public void format(String text) {
System.out.println("<html><body>" + text + "</body></html>");
}
}
// 上下文类
class TextEditor {
private TextFormatter formatter;
public TextEditor(TextFormatter formatter) {
this.formatter = formatter;
}
public void publishText(String text) {
formatter.format(text);
}
}
// 客户端代码
public class StrategyPatternExample {
public static void main(String[] args) {
String text = "Hello, Strategy Pattern!";
TextEditor plainEditor = new TextEditor(new PlainTextFormatter());
plainEditor.publishText(text);
TextEditor htmlEditor = new TextEditor(new HtmlTextFormatter());
htmlEditor.publishText(text);
}
}
在这个例子中,TextFormatter
是策略接口,PlainTextFormatter
和 HtmlTextFormatter
是具体策略类,而 TextEditor
是上下文类。客户可以选择在不同的时机使用不同的 TextFormatter
来处理文本内容。