设计模式 - 策略模式(Strategy Pattern)
介绍
策略模式是一种行为设计模式,它让你能在运行时改变对象的行为。此模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。
实现
我们以一个简单的游戏为例,游戏中有多个角色,每个角色都有不同的攻击方式。我们将使用策略模式来实现角色的攻击行为。
定义策略接口
首先定义一个策略接口,代表各种可能的攻击行为。
interface AttackStrategy {
void attack();
}
创建具体策略
然后创建几个具体的策略类,它们实现了 AttackStrategy
接口。
class MeleeAttack implements AttackStrategy {
@Override
public void attack() {
System.out.println("Attacking with melee weapons.");
}
}
class RangedAttack implements AttackStrategy {
@Override
public void attack() {
System.out.println("Attacking with ranged weapons.");
}
}
class MagicAttack implements AttackStrategy {
@Override
public void attack() {
System.out.println("Casting spells to attack.");
}
}
创建上下文类
创建一个角色类(上下文),它可以持有不同的攻击策略。
class Character {
private AttackStrategy attackStrategy;
public Character(AttackStrategy attackStrategy) {
this.attackStrategy = attackStrategy;
}
public void setAttackStrategy(AttackStrategy attackStrategy) {
this.attackStrategy = attackStrategy;
}
public void performAttack() {
attackStrategy.attack();
}
}
使用策略模式
接下来,在主程序中使用策略模式来设置不同的角色攻击方式。
public class Game {
public static void main(String[] args) {
// 创建一个近战角色
Character warrior = new Character(new MeleeAttack());
warrior.performAttack(); // 输出 "Attacking with melee weapons."
// 创建一个远程角色
Character archer = new Character(new RangedAttack());
archer.performAttack(); // 输出 "Attacking with ranged weapons."
// 创建一个法师角色
Character wizard = new Character(new MagicAttack());
wizard.performAttack(); // 输出 "Casting spells to attack."
// 更改角色的攻击方式
warrior.setAttackStrategy(new MagicAttack());
warrior.performAttack(); // 输出 "Casting spells to attack."
}
}
使用场景
策略模式适用于以下情况:
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个来配置一个类的方法。
- 需要在运行时刻选择算法或行为。
- 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
总结
策略模式通过定义一系列算法并将它们封装起来,使得算法可以互换。这不仅增加了代码的可维护性,也使得扩展和修改变得容易。策略模式特别适合于那些需要在运行时根据条件选择不同行为的应用场景。
以上就是策略模式的一个实现案例,希望这篇文章能帮助你更好地理解和运用策略模式。
评论区