设计模式之命令模式

/**
 * 命令模式
 */
public class Main {

    public static void main(String[] args) {
        CatReceiver catReceiver = new CatReceiver();
        RunCommand runCommand = new RunCommand(catReceiver);
        StopCommand stopCommand = new StopCommand(catReceiver);
        Invoker invoker = new Invoker();
        invoker.addCommand(runCommand);
        invoker.addCommand(stopCommand);
        invoker.execute();
    }

}

public interface Command {

    void execute();

}

class CatReceiver {

    public void run() {
        System.out.println("cat is running");
    }

    public void stop() {
        System.out.println("stop running");
    }

}

public class RunCommand implements Command{

    public CatReceiver catReceiver;

    public RunCommand(CatReceiver catReceiver){
        this.catReceiver = catReceiver;
    }

    @Override
    public void execute() {
        catReceiver.run();;
    }
}

public class StopCommand implements Command{

    public CatReceiver catReceiver;

    public StopCommand(CatReceiver catReceiver){
        this.catReceiver = catReceiver;
    }

    @Override
    public void execute() {
        catReceiver.stop();
    }
}

import java.util.ArrayList;
import java.util.List;

public class Invoker {

    private List<Command> orderList;

    public Invoker() {
        orderList = new ArrayList<Command>();
    }

    public void addCommand(Command command){
        orderList.add(command);
    }

    public void execute(){
        orderList.forEach(Command::execute);
    }

}

问题:
如果你有一系列需要执行的操作,但是还可能增加一些新的操作,或者删除一些操作,直观的写法是把这些操作都写到一个函数里,这样耦合就高了,新增一个操作还需要改代码。
用法:
这个设计模式最难的是怎么理解命令,什么是命令。
其实消息系统就是典型的命令设计模式,一个消息就是一个命令,每个消息都会实现同样的接口,至于这个消息就是扮演接受者的角色。

命令模式和策略模式的区别
网上也有不少讨论的,总结起来策略模式体现的是多个策略单选一个,命令模式体现的是多个策略执行的问题,而不是选择的问题,且策略模式其实是接口的最基本使用方法,命令模式是一种特殊的策略模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值