设计模式(十六)命令模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112


导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

前言

命令模式单从实现上看,没有什么难度,无非就是一个命令的调用者(Invoker),几个命令类(ConcreteCommand),几个收到命令的执行类(ConcreteReceiver),有几个命令类就有几个执行了,他们之间是一对一的关系
Invoker调用者角色:接收到命令,并执行命令
Command命令角色:需要执行的所有命令都在这里声明
Receiver接受者角色:该角色就是干活的角色,命令传递到这里是应该被执行的

例子

LZ以电脑开机,关机为例子,简单的实现如下


/***
 *
 *@Author ChenjunWang
 *@Description:抽象命令类
 *@Date: Created in 23:39 2018/4/12
 *@Modified By:
 *
 */
public interface Command {
    void execute();
    void undo();
}

/***
 *
 *@Author ChenjunWang
 *@Description:关机命令类
 *@Date: Created in 0:02 2018/4/13
 *@Modified By:
 *
 */
public class CloseCommand implements Command {
    private CloseReceiver closeReceiver;
    public CloseCommand(CloseReceiver closeReceiver) {
        this.closeReceiver = closeReceiver;
    }

    @Override
    public void execute() {
        closeReceiver.action();

    }

    @Override
    public void undo() {

        closeReceiver.undo();
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:开机命令类
 *@Date: Created in 23:50 2018/4/12
 *@Modified By:
 *
 */
public class OpenCommand implements Command {
    private OpenReceiver receiver;
    public OpenCommand(OpenReceiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {

        receiver.action();
    }

    @Override
    public void undo() {


    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:关机执行类
 *@Date: Created in 0:03 2018/4/13
 *@Modified By:
 *
 */
public class CloseReceiver {
    public void action(){
        System.out.println("收到命令后关闭");
    }
    public void undo(){

        System.out.println("撤销关闭任务");
    }

}

/***
 *
 *@Author ChenjunWang
 *@Description:开机执行类
 *@Date: Created in 23:43 2018/4/12
 *@Modified By:
 *
 */
public class OpenReceiver {

    public void action(){
        System.out.println("收到命令后开机");
    }
    public void undo(){

        System.out.println("撤销开机任务");
    }

}

/***
 *
 *@Author ChenjunWang
 *@Description:调用类
 *@Date: Created in 23:43 2018/4/12
 *@Modified By:
 *
 */
public class Invoker {
    private Command command;


    public void setCommand(Command command) {
        this.command = command;
    }
    public void action(){
        command.execute();
    }

}

/***
 *
 *@Author ChenjunWang
 *@Description:测试类
 *@Date: Created in 23:51 2018/4/12
 *@Modified By:
 *
 */
public class Test {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();
        invoker.setCommand(new OpenCommand(new OpenReceiver()));
        invoker.action();
        invoker.setCommand(new CloseCommand(new CloseReceiver()));
        invoker.action();

    }
}

执行结果如下
----------------------------
收到命令后开机
收到命令后关闭


假如你需要增加一个命令,比如待机命令,那么增加一个待机命令类,和一个待机执行类就行了,调用者每次都通过命令类来执行命令,而命令类把命令传达给接受类,最后由接收类来执行命令。

总结

优点

(1)调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command 抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。
(2)Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严 重的代码耦合。

缺点

(1)每次增加新的命令都需要增加命令类和接收类,若命令非常多的话,类的数量将会非常巨大

2019年补充

我们发现,我们每次在使用的时候都需要指定具体的执行者,然后命令也才执行一次(因为开机,关机是一次性的操作),那为何还要用命令者去叫执行者执行呢? 直接new出来然后执行就好了啊,所以楼主例子举的不是很好,命令者模式很大的优势是可以执行命令队列,而且执行者这个角色是可以复用的,也就是说,我们可以创建很多的命令者都命令一个执行者去做任务,任务可以立马执行,也可以放到一个队列里,然后到时候统一执行。

Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/main/java/command

回到最上方

有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢_!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值