结构型 - 策略模式

目录
设计思想
策略模式(Strategy)是一种行为设计模式,它定义了一系列的算法,将每个算法封装起来,并且使它们可以互相替换。策略模式使得算法可以独立于客户端而变化。
策略模式通常涉及两个主要角色:
- 上下文(Context):上下文负责维护一个对策略对象的引用
- 策略(Strategy):策略定义了一个接口或抽象类,包含了具体算法的实现。
类图
代码实现
interface Strategy {
void execute(String data);
}
class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void doSomething() {
this.strategy.execute();
}
}
class ConcreteStrategyA implements Strategy {
@Override
public void execute(String data) {
System.out.println("ConcreteStrategyA execute invoke.");
}
}
class ConcreteStrategyB implements Strategy {
@Override
public void execute(String data) {
System.out.println("ConcreteStrategyB execute invoke.");
}
}
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setStrategy(new ConcreteStrategyA());
context.doSomething();
context.setStrategy(new ConcreteStrategyB());
context.doSomething();
}
}
优缺点
优点:
- 符合开闭原则,你无需对上下文进行修改就能够引入新的策略。
- 策略模式可以避免使用大量的条件语句来选择不同的算法,使得代码更加清晰、简洁。
- 算法被封装在独立的策略类中,使得这些算法可以独立于上下文类而变化,提高了代码的可维护性和可复用性。
缺点:
- 使用策略模式会导致系统中类的数量增加,每个具体策略都需要一个单独的类,可能会使得类的管理和维护变得复杂。
- 客户端需要了解所有的策略类,并在使用时选择适当的策略,这可能增加了客户端的复杂性。
适用场景
- 当一个系统的算法需要经常切换时,使用策略模式可以方便地在运行时选择不同的算法。
- 当一个类有很多条件语句来选择不同的行为时,使用策略模式可以提高代码的可读性和可维护性。
- 当类的相似行为有不同的实现时,可以使用策略模式将这些行为抽象成策略,实现不同的具体策略类。
- 如果一个类的算法有多个变体,并且这些变体经常需要切换,策略模式是一个不错的选择。