命令模式(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函数式编程》后有感而写,感兴趣的小伙伴可以该书籍。