文档章节

【行为型】- 命令模式

ZeroneLove
 ZeroneLove
发布于 02/23 11:31
字数 672
阅读 24
收藏 0

命令模式

将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象,命令模式也支持撤销操作。

角色

  • 抽象命令(Command):命令接口,声明命令执行的方法

  • 具体命令(ConcreteCommand):具体命令,实现要执行的方法,通常与命令接收者绑定,由接收者去执行具体的业务逻辑

  • 接收者(Receiver):真正执行命令的对象。任何类都可成为一个接收者,只要能实现命令要求实现的相应功能

  • 调用者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

  • 客户端(Client):命令由客户端来创建,并设置命令的接收者。


抽象命令:Command

package com.zhiwei.command;
public abstract class Command {

    /**
    * 命令的真实执行者
    */
    protected Receiver receiver;
    public  Command(Receiver receiver) {
        this.receiver=receiver;
    }

    /**
    * 命令执行的功能
    */
    public abstract void execute();
}

具体命令:ConcreteCommand

package com.zhiwei.command;

public class ConcreteCommand extends Command{

    public ConcreteCommand(Receiver receiver) {
        super(receiver);
    }

    /**
    * 调用命令引用的接收者真正执行命令
    */
    @Override
    public void execute() {
        receiver.processCommand();
    }
}

接收者:Receiver

package com.zhiwei.command;

public class Receiver {

    public void processCommand(){
        try{
        System.out.println("厨师正在做菜.....");
        Thread.sleep(1000);
        System.out.println("厨师做菜完成......");
        }catch (Exception e) {
                e.printStackTrace();
        }
    }
}

调用者:Invoker

package com.zhiwei.command;
public class Invoker {

    /**调用者的持有的命令引用*/
    private Command command;

    public void setCommand(Command command) {
        System.out.println("客户正在点菜......");
        this.command=command;
        System.out.println("客户点菜完毕.......");
    }

    /**
        * 调用真正的命令执行者处理命令
        */
    public void executeCommand(){
        System.out.println("服务员通知厨师做菜.......");
        this.command.execute();
    }
}

测试代码:

//定义一个真正的命令执行者:厨师
Receiver receiver = new Receiver(); 

//定义一个命令:里面包含对执行者的引用
Command command = new ConcreteCommand(receiver); 

//定义一个命令的调用者:服务员
Invoker invoker = new Invoker(); 

//设置命令:点菜
invoker.setCommand(command);  

 //执行命令:服务员下单,厨师执行
invoker.executeCommand();

通俗解释:

顾客(客户端)进入饭馆,服务员招待(invoker),客户点菜(invoker.setCommand(command)),然后服务员下单给后台的厨师(Receiver)做菜(invoker.executeCommand()-->receiver. processCommand()方法)

扩展:Invoker内部包含Command的引用,Command内部包含Receiver引用,这里也可理解为一种代理模式的应用

© 著作权归作者所有

ZeroneLove
粉丝 5
博文 164
码字总数 133695
作品 0
深圳
高级程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.4K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
168
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
56分钟前
11
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
4
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.2K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部