策略模式(Strategy)
定义:
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
通俗解释:
玩过英雄联盟的小伙伴都知道有野兽之灵乌迪尔这个英雄,这个英雄拥有不同的形态,例如熊形态,龟形态,老虎形态。如果代码编写成 if-else,通过判断野兽之灵是什么形态来进行什么样的攻击的话,后期游戏想继续增加新的形态的话,就会破坏原有的代码。所以我们必须遵循开闭原则,通过将形态抽离出来进行解耦。在 JDK 当中的集合排序,通过传入不同的比较器来进行比较,也是策略模式的体现。
代码:
抽象策略类:拥有攻击的方法
public interface Strategy {
// 攻击
void attack();
}
具体策略类:三种不同的形态
public class Tiger implements Strategy {
@Override
public void attack() {
System.out.println("使用老虎形态进行攻击!");
}
}
public class Tortoise implements Strategy{
@Override
public void attack() {
System.out.println("使用乌龟形态进行攻击!");
}
}
public class Wolf implements Strategy {
@Override
public void attack() {
System.out.println("使用狼人形态进行攻击!");
}
}
环境角色类:野兽之灵,持有策略对象(动物形态)
public class AnimalSoul {
// 当前的形态
private Strategy animal;
// 使用形态进行攻击
public void animalAttack() {
animal.attack();
}
public Strategy getStrategy() {
return animal;
}
public void setStrategy(Strategy strategy) {
this.animal = strategy;
}
}
测试策略模式
public class TestStrategy {
public static void main(String[] args) {
AnimalSoul animalSoul = new AnimalSoul();
// 切换老虎形态
animalSoul.setStrategy(new Tiger());
animalSoul.animalAttack();
// 切换乌龟形态
animalSoul.setStrategy(new Tortoise());
animalSoul.animalAttack();
// 切换狼人形态
animalSoul.setStrategy(new Wolf());
animalSoul.animalAttack();
}
}
运行结果:
使用老虎形态进行攻击!
使用乌龟形态进行攻击!
使用狼人形态进行攻击!
解析:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好,遵循开闭原则。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于