lambda之命令者模式

本文探讨了命令模式在游戏人物操作中的应用,通过Lambda表达式简化代码,展示了其在行为传递上的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。详见菜鸟教程描述

      以上是一段高度抽象的描述,不是特别熟悉的该模式的情况下,看完后就是云里雾里,要理解高度抽象这个段话,就得返璞归真,理解这段高度概括的话以前是为了概括那些实例,所以就得new一个实例。

     菜鸟教程里边有一个未使用lamdba表达式的案例,买卖股票。可以和我后面使用lambda表达式案例做个对比,看看lambda表达式给这个模式带来了那些具体的变化。

     这个示例来自个人喜欢玩的三国游戏,控制游戏人物进行攻击和逃跑操作。

     首先得有一个Person接口,拥有攻击和逃跑操作,后面的任务都实现该接口:

//游戏人物通用接口
public interface Person {
    
    //攻击
    void fight();
    
    //逃跑
    void runAway();
    
}

具体人物登场,以下任务读拼音,大家应该都知道是谁了。

public class Guanyu implements Person {

    @Override
    public void fight() {
        System.out.println("飞龙在天");
    }

    @Override
    public void runAway() {
        System.out.println("赤兔马逃脱");
    }
    
    public void special(){
        System.out.println("水淹七军");
    }
}
public class Zhuge implements Person {

    @Override
    public void fight() {
        System.out.println("火球术");
    }

    @Override
    public void runAway() {
        System.out.println("百分百逃脱");
    }
    
    public void skill(){
        System.out.println("呼风唤雨");
    }
}

需要一个动作行为接口,人物所做的所有动作都来源于来接口。

public interface Action {
    //执行动作
    public void perform();
}

以上准备就绪,现在假设游戏在GameBoy中运行。

public class GameBoy {
    
    List<Action> list;

    //初始化一个GameBoy
    public GameBoy() {
        this.list = new ArrayList<>();
    }
    
    //选择人物动作
    public void operate(Action action){
        list.add(action);
    }
    
    //选择完毕人物动作,确认执行,循环执行所选择的动作
    public void confirm(){
        list.forEach(Action::perform);
    }
}

最后,测试下游戏运行效果

public class Play {

    public static void main(String[] args) {
        GameBoy gameBoy = new GameBoy();
        //操作诸葛
        Person zhuge = new Zhuge();
        //操作关羽
        Person guanyu = new Guanyu();
        gameBoy.operate(zhuge::fight);
        gameBoy.operate(guanyu::fight);
        
        //想要使用绝招,引用类型得转换为Zhuge类型
        gameBoy.operate(((Zhuge)zhuge)::skill);
        
        //甚至不需要任何具体的Person,即可开始执行命令
        gameBoy.operate(() -> {
            System.out.println("自定义的招数");
            System.out.println("自定义的绝招");
        });
        
        gameBoy.confirm();
    }

}

以上通过lambda表示表现出来,不需要实现Action类的行为类,减少了代码和类,看上去更加简洁,甚至不需要任何Person和实现Person的类,也可以运行传递的lambda函数的内容。

以上就是全部内容,本文是读完《java8函数式编程》后有感而写,感兴趣的小伙伴可以该书籍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值