Appearance
策略模式
介绍
策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式允许算法独立于使用它们的客户端而变化,从而实现算法的灵活性和可扩展性。
策略模式的主要思想是将算法或行为封装在独立的对象中,这些对象称为策略。客户端代码通过使用策略对象来执行算法,而不是直接实现算法。这样,客户端代码可以灵活地选择不同的策略,而无需修改代码。
策略模式的主要组成部分包括:策略接口、具体策略类、上下文类。
- 策略接口:定义了所有策略类必须实现的算法或行为。
- 具体策略类:实现了策略接口,提供了具体的算法或行为。
- 上下文类:持有策略对象的引用,并在需要时调用策略对象的算法或行为。
策略模式的主要优点包括:
- 算法或行为的独立性和可扩展性:可以通过添加新的策略类来扩展算法或行为,而无需修改现有代码。
- 算法或行为的灵活性和可互换性:客户端代码可以通过使用不同的策略对象来执行不同的算法或行为,而无需修改代码。
- 代码的可读性和可维护性:将算法或行为封装在独立的对象中,可以使代码更加清晰和易于维护。
策略模式的主要缺点包括:
- 策略对象的管理:需要管理多个策略对象,可能会增加代码的复杂性。
- 策略对象的创建:需要创建多个策略对象,可能会增加代码的复杂性。
策略模式适用于以下场景:
- 当算法或行为需要独立于使用它们的客户端而变化时。
- 当需要灵活地选择不同的算法或行为时。
- 当需要扩展算法或行为时。
代码示例
java
public interface Strategy {
String description();
}
java
public class Player {
private Strategy strategy;
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void play() {
System.out.println("开始游戏,使用挂机策略为");
System.out.println(strategy.description());
}
}
java
public class DefaultStrategy implements Strategy{
private final Object[] steps = {
"常规策略",
"查看角色状态",
"查看战力",
"去矿区挖矿",
"然后去PK",
"最后刷副本",
"结束游戏"
};
@Override
public String description() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("╭───────────────────────────────\n")
.append("├策略名称:%s\n");
for (int i = 1; i < steps.length; i++) {
stringBuilder.append("├第").append(i).append("步:%s\n");
}
stringBuilder.append("╰───────────────────────────────");
return String.format(stringBuilder.toString(), steps);
}
}
java
public class DiyStrategy implements Strategy{
private final Object[] steps;
public DiyStrategy(Object[] steps) {
this.steps = steps;
}
@Override
public String description() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("╭───────────────────────────────\n")
.append("├策略名称:%s\n");
for (int i = 1; i < steps.length; i++) {
stringBuilder.append("├第").append(i).append("步:%s\n");
}
stringBuilder.append("╰───────────────────────────────");
return String.format(stringBuilder.toString(), steps);
}
}
java
public class Client {
public static void main(String[] args) {
Player player = new Player();
player.setStrategy(new DefaultStrategy());
player.play();
player.setStrategy(new DiyStrategy(new Object[]{
"我的策略一",
"先刷副本升级",
"再打材料做任务",
"然后去竞技场",
"如果有时间去打装备"
}));
player.play();
}
}
运行结果:
txt
开始游戏,使用挂机策略为
╭───────────────────────────────
├策略名称:常规策略
├第1步:查看角色状态
├第2步:查看战力
├第3步:去矿区挖矿
├第4步:然后去PK
├第5步:最后刷副本
├第6步:结束游戏
╰───────────────────────────────
开始游戏,使用挂机策略为
╭───────────────────────────────
├策略名称:我的策略一
├第1步:先刷副本升级
├第2步:再打材料做任务
├第3步:然后去竞技场
├第4步:如果有时间去打装备
╰───────────────────────────────