如何使用Lambda表达式实现策略模式?代码举例讲解

策略模式定义一系列算法,并将每个算法封装起来,使它们可以相互替换。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 表达式的可读性就较低,这时采用其他方式可能更合适。