摘要
策略模式
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它们的客户端而变化。
以下是策略模式的一些关键角色:
- Context(上下文):定义了客户端感兴趣的接口,并且维护一个对策略对象的引用。通常,上下文会将客户端请求委派给策略对象。
- Strategy(策略):是一个接口或抽象类,定义了一系列算法的公共接口。具体的策略类实现了这个接口,提供了具体的算法实现。
UML类图
Java示例代码
// 策略接口
interface Strategy {
void execute();
}
// 具体策略A
class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
System.out.println("执行策略A");
}
}
// 具体策略B
class ConcreteStrategyB implements Strategy {
@Override
public void execute() {
System.out.println("执行策略B");
}
}
// 上下文类
class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
if (strategy != null) {
strategy.execute();
}
}
}
// 测试类
public class StrategyPatternExample {
public static void main(String[] args) {
// 创建上下文对象
Context context = new Context();
// 使用策略A
context.setStrategy(new ConcreteStrategyA());
context.executeStrategy(); // 执行策略A
// 使用策略B
context.setStrategy(new ConcreteStrategyB());
context.executeStrategy(); // 执行策略B
}
}
策略模式和简单工厂模式结合
结合策略模式和简单工厂模式可以更灵活地管理对象的创建和选择,客户端调用时无需感知Strategy,仅感知Context即可,进一步减少耦合
// 策略接口
interface Strategy {
void execute();
}
// 具体策略A
class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
System.out.println("执行策略A");
}
}
// 具体策略B
class ConcreteStrategyB implements Strategy {
@Override
public void execute() {
System.out.println("执行策略B");
}
}
// 上下文类
class Context {
private Strategy strategy;
// 内部简单工厂方法,根据类型创建具体策略对象
private static Strategy createStrategy(String strategyType) {
if ("A".equals(strategyType)) {
return new ConcreteStrategyA();
} else if ("B".equals(strategyType)) {
return new ConcreteStrategyB();
} else {
throw new IllegalArgumentException("Unknown strategy type: " + strategyType);
}
}
// 构造方法,根据类型创建具体策略对象
public Context(String strategyType) {
this.strategy = createStrategy(strategyType);
}
public void executeStrategy() {
if (strategy != null) {
strategy.execute();
}
}
}
// 测试类
public class StrategyAndFactoryPatternExample {
public static void main(String[] args) {
// 创建上下文对象并设置策略类型
Context contextA = new Context("A");
Context contextB = new Context("B");
// 执行策略
contextA.executeStrategy(); // 执行策略A
contextB.executeStrategy(); // 执行策略B
}
}
评论区
0/2048