策略模式定义一系列算法,并将每个算法封装起来,使它们可以相互替换。Lambda 表达式可以很好地实现策略模式。我们来看一个例子:
假设我们有一个游戏角色,它的攻击行为可以有多种实现,这就是一个比较典型的策略模式场景。
使用 Lambda 表达式实现策略模式:
// Attack 接口定义多种攻击行为
@FunctionalInterface
interface Attack {
void attack();
}
// 具体的攻击行为实现
Attack kick = () -> System.out.println("踢了一脚");
Attack punch = () -> System.out.println("出拳攻击");
// 游戏角色,持有一种攻击行为
class Fighter {
private Attack attack;
public Fighter(Attack attack) {
this.attack = attack;
}
public void fight() {
attack.attack();
}
}
// 使用场景
Fighter f = new Fighter(punch);
f.fight(); // 出拳攻击
f.setAttack(kick);
f.fight(); // 踢了一脚
这里我们定义了一个 Attack 接口表示攻击行为,kick 和 punch 是两种具体的攻击实现。Fighter 类持有 Attack,在 fight() 方法中调用具体的攻击行为。
所以我们可以通过为 Fighter 类的对象设置不同的 Attack 来选择不同的攻击策略,这就是策略模式的实现。
相比传统的匿名内部类实现,Lambda 表达式使得代码更加简洁,更加关注业务逻辑。所以我推荐使用 Lambda 表达式来实现简单的策略模式。但是,如果策略比较复杂,Lambda 表达式的可读性就较低,这时采用其他方式可能更合适。