一天学习一个设计模式之命令模式

命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

 

代码如下:

1 /**
2  * 抽象命令角色类
3  */
4 public interface Command {
5     /**
6      * 执行方法
7      */
8     void execute();
9 }
 1 /**
 2  * 接收者角色类
 3  */
 4 public class Receiver {
 5     /**
 6      * 真正执行命令相应的操作
 7      */
 8     public void action(){
 9         System.out.println("执行操作");
10     }
11 }
 1 /**
 2  * 具体命令角色类
 3  */
 4 public class ConcreteCommand implements Command {
 5 
 6     //持有相应的接收者对象
 7     private Receiver receiver = null;
 8 
 9     /**
10      * 构造方法
11      *
12      * @param receiver
13      */
14     public ConcreteCommand(Receiver receiver) {
15         this.receiver = receiver;
16     }
17 
18 
19     @Override
20     public void execute() {
21         //通常会转调用接收者对象的相应方法,让接收者来真正执行功能
22         receiver.action();
23     }
24 }
 1 /**
 2  * 请求者角色类
 3  */
 4 public class Invoker {
 5     /**
 6      * 持有命令对象
 7      */
 8     private Command command=null;
 9 
10     /**
11      * 构造方法
12      * @param command
13      */
14     public Invoker(Command command) {
15         this.command = command;
16     }
17 
18     /**
19      * 行动方法
20       */
21     public void action(){
22         command.execute();
23     }
24 }
 1 /**
 2  * 客户端
 3  */
 4 public class Client {
 5     public static void main(String[] args) {
 6         //创建接收者
 7         Receiver receiver=new Receiver();
 8         //创建命令对象,设定它的接收者
 9         Command command=new ConcreteCommand(receiver);
10         //创建请求者,把命令对象设置进去
11         Invoker invoker=new Invoker(command);
12         //执行方法
13         invoker.action();
14     }
15 }

 

以下例子是《大话设计模式》中的例子:

 1 /**
 2  * 烤串者(命令执行者)
 3  */
 4 public class Barbecuer {
 5     public void bakeMutton(){
 6         System.out.println("烤羊肉串");
 7     }
 8     public void bakeChickenWing(){
 9         System.out.println("烤鸡翅");
10     }
11 }
 1 /**
 2  * 抽象命令类
 3  */
 4 public abstract class Command {
 5     //抽象命令类,只需要确定‘烤肉串者'是谁
 6     protected Barbecuer receiver;
 7 
 8     /**
 9      *
10      * @param receiver 参数为命名执行人
11      */
12     public Command(Barbecuer receiver) {
13         this.receiver = receiver;
14     }
15 
16     //执行命令
17     abstract public void excuteCommand();
18 }
 1 /**
 2  * 烤鸡翅命令
 3  */
 4 public class BakeChickenWingCommand extends Command {
 5     public BakeChickenWingCommand(Barbecuer receiver) {
 6         super(receiver);
 7     }
 8 
 9     @Override
10     public void excuteCommand() {
11         receiver.bakeChickenWing();
12     }
13 }
 1 /**
 2  * 烤羊肉串命令
 3  */
 4 public class BakeMuttonCommand extends Command {
 5 
 6     public BakeMuttonCommand(Barbecuer receiver) {
 7         super(receiver);
 8     }
 9 
10     @Override
11     public void excuteCommand() {
12         receiver.bakeMutton();
13     }
14 }
 1 /**
 2  * 服务员类
 3  */
 4 public class Waiter {
 5     private List<Command> orders=new ArrayList<>();
 6     /**
 7      * 不管用户想要什么烤肉,反正都是命令,只管记录订单,然后通知烤肉者执行
 8      * @param command
 9      */
10     public void setOrder(Command command){
11         orders.add(command);
12         System.out.println("增加订单:"+command.toString()+" 时间:"+new Date());
13     }
14     public void cancelOrder(Command command){
15         orders.remove(command);
16         System.out.println("取消订单:"+command.toString()+" 时间:"+new Date());
17     }
18     //通知执行
19     public void notifyExcuteCommand(){
20         for (Command command:orders
21              ) {
22             command.excuteCommand();
23         }
24 
25     }
26 }
 1 public class Client {
 2     public static void main(String[] args) {
 3         //命令执行人
 4         Barbecuer boy=new Barbecuer();
 5         Command bakeMuttonCommand1=new BakeMuttonCommand(boy);
 6         Command bakeMuttonCommand2=new BakeMuttonCommand(boy);
 7         Command bakeChickenWingCommand1=new BakeChickenWingCommand(boy);
 8         //命令布人
 9         Waiter girl=new Waiter();
10 
11         //开门营业
12         //记录订单命令
13         girl.setOrder(bakeMuttonCommand1);
14         girl.setOrder(bakeMuttonCommand2);
15         girl.setOrder(bakeChickenWingCommand1);
16 
17         //点菜完毕,通知厨房(下达命令)
18         girl.notifyExcuteCommand();
19         girl.cancelOrder(bakeChickenWingCommand1);
20     }
21 }

 命令模式作用

第一,它能较容易地设计一个命令队列;

第二,在需要的情况下,可以较容易地将命令记入日志;

第三,允许接收请求的一方决定是否要否决请求。

第四,可以容易地实现对请求的撤销和重做。

第五,由于加新的具体命令类不影响其他类,因此增加新的具体命令类很容易。

命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

转载于:https://www.cnblogs.com/gousheng107/p/8126814.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PNAS:张航课题组揭示人类为何“扭曲”概率信息

来源&#xff1a;脑科学2020年8月25日&#xff0c;北京大学心理与认知科学学院、北京大学IDG麦戈文脑科学研究所、北大-清华生命科学联合中心的张航研究组在美国科学院院刊&#xff08;PNAS&#xff09;上发表了题为“The bounded rationality of probability distortion”的文…

修改结构体中成员的值

#include <iostream> using namespace std; struct student { char name[10]; float grade; }; //更改student数据的grade成员&#xff0c;参数形式为引用 void change(student& x, float grade) { x.grade grade; } //更改student数据的grade成员&…

为什么AI感知与人类感知无法直接比较?

来源丨TechTalks作者丨Ben Dickson编译丨科技行者人类级别的表现、人类级别的精度……在开发AI系统的企业中&#xff0c;我们经常会听到这类表述&#xff0c;其指向范围则涵盖人脸识别、物体检测&#xff0c;乃至问题解答等各个方面。随着机器学习与深度学习的不断进步&#xf…

微软白皮书:47页报告详解中国芯片设计云技术

来源&#xff1a;智东西在多方面因素的推动下&#xff0c;中国的芯片设计行业迎来了前所未有的发展契机。当前&#xff0c;我国芯片设计业的产品范围已经涵盖了几乎所有门类&#xff0c;且部分产品已拥有了一定的市场规模&#xff0c;但我国芯片产品总体上仍然处于中低端&#…

一文读懂马斯克展示脑机接口:硬币大小芯片植入猪脑 实时读取猪脑信息

视频&#xff1a;马斯克展示脑机接口设备无线实时读取猪脑信息&#xff0c;时长约7分10秒来源&#xff1a;腾讯科技马斯克展示了一群实验猪。这些实验猪之前曾接受过外科手术&#xff0c;由手术机器人将最新版的Neuralink设备植入大脑。这些项目的目标都是利用大脑植入技术实现…

循环,函数,指针作业

一、循环 题目1&#xff1a;7-6 统计素数并求和 提交列表&#xff1a; 流程图&#xff1a; 问题&#xff1a; 解决&#xff1a;mn最多一个素数&#xff0c;都为0无答案&#xff1b;m和n本身也可能是素数。 题目2&#xff1a;7-12 约分最简分式 提交列表&#xff1a; 流程图&…

华为徐文伟:后香农时代,面向数学的十大挑战问题

本文为2020年8月28日徐文伟在长沙由中国工业与应用数学学会举办的“数学促进企业创新发展论坛”上的发言来源&#xff1a;中国科学院院刊徐文伟华为技术有限公司董事&#xff0c;华为战略研究院院长后香农时代数学决定未来发展的边界数学作为基础的基础&#xff0c;将决定未来发…

06006_redis数据存储类型——String

1、概述 &#xff08;1&#xff09;字符串类型是Redis中最为基础的数据存储类型&#xff0c;它在Redis中是二进制安全的&#xff0c;这意味着该类型可以接受任何格式的数据&#xff0c;如JPEG图像数据或Json对象描述信息等&#xff1b; &#xff08;2&#xff09;在Redis中字符…

comparator 多个条件控制_JUnit5学习之四:按条件执行

欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容&#xff1a;所有原创文章分类和汇总&#xff0c;及配套源码&#xff0c;涉及Java、Docker、Kubernetes、DevOPS等&#xff1b;本篇概览本文是《JUnit5学习》系列的第四篇&#xff0c;有时咱们希望测试方法仅在一定…

“星链”或成美军未来作战理念新载体

本文来源&#xff1a;中国军网在美国航天政策愈发重视商业航天发展&#xff0c;尤其是美太空军发展对巨型弹性低轨星座提出重大需求的背景下&#xff0c;美国太空探索公司SpaceX乘势将业务从商业航天发射、载人航天货物和乘员运输逐渐扩展至低轨宽带通信服务&#xff0c;即“星…

基基于多态的职工管理系统

效果 添加 显示 删除 查找 排序&#xff08;不演示了&#xff09; 清空所有 头文件 员工类 #pragma once #include <iostream> #include <string> using namespace std;//职工抽象基类 class Worker { public://显示个人信息virtual void showInfo() 0;//获取…

typescript箭头函数参数_Typescript 入门基础篇(一)

Typescript 基础Typescript是Javascript的一个超集。以下typescript简称为ts, 此文章主要是对ts官网文档的一个简化&#xff0c;缩短学习基础时间。类型基础ts 的类型主要有布尔值、数字、字符串、数组、元组、枚举、Any、Void、Null和Undefined、Never。# Boolean let boo : b…

sublime学习笔记

学习课程地址&#xff1a;快乐的sublime编辑器_sublime编辑器使用 另可参考笔记地址&#xff1a; http://c.haoduoshipin.com/happysublime/ http://blog.csdn.net/u014465934/article/details/72810763 PS&#xff1a;博主的一些文章地址&#xff1a;http://happypeter.github…

里程碑式的数学证明,攻破著名Erdős猜想中关键障碍

大数据文摘出品来源&#xff1a;wired编译&#xff1a;Canary、Andy最近&#xff0c;两名数学家解决了一个关于整数相加性质最著名猜想中的第一部分。该猜想由匈牙利传奇数学家Paul Erdős于60多年前提出&#xff0c;一个无限整数序列在何时一定会包含至少有三个等差数的模式&a…

浅复制和深复制

浅复制是由默认构造函数实现的&#xff0c;将对应数据成员一一复制。 浅复制 template<class T> Array<T>::Array(const Array<T>&a) {sizea.size;a.list list; }如果主函数中有这样的语句&#xff1a; int main() {Array<int> a(10);Array<…

admin select 2 异步_解决Angularjs异步操作后台请求用$q.all排列先后顺序问题

最近我在做angularjs程序时遇到了一个问题1.页面有很多选择框&#xff0c;一个选择框里面有众多的选择项&#xff0c;和一个默认选定的项,像下面这样(很多选择框&#xff0c;不只一个)&#xff1a;2.众多的选项要从后台接口得到&#xff0c;默认项从另一个后台接口得到&#xf…

产业|世界十大工业自动化公司,你知道几家?

来源&#xff1a;机械前线国内工业自动化行业的竞争激烈&#xff0c;国外工业自动化设备、产品制造商依然控制国内上游产品供应的主要市场&#xff0c;下面来看看国外最赚钱的工业自动化公司有哪些。▶1、德国西门子西门子股份公司(SIEMENSAGFWB:SIE&#xff0c;NYSE:SI)是全球…

12月25晚-12月29日做的两个网页

1 <!doctype html>2 <html>3 <head>4 <meta charset"utf-8">5 <title>仿山东理工大学</title>6 <link rel"stylesheet" href"css/wangye.css">7 <link href"img/favicon.ico" r…

2运行内存多大_智能设备中的内存与容量为何傻傻分不清?它们的区别是什么?...

在日常生活中&#xff0c;很多时候会把某些电子产品的容量说成内存&#xff0c;或者把内存说成了容量。比如有人问&#xff1a;“这个手机的内存多大&#xff1f;”或许会有这样回答的&#xff1a;“内存是256G。”这种问答方式虽然看似很普通&#xff0c;如果让业内人士以及了…

Nature突破:首个比头发丝还细的机器人诞生了!可用针头注射入人体

来源&#xff1a;科研大匠1959年&#xff0c;诺贝尔奖得主、理论物理学家Richard Feynman 首次提出微型医用机器人的概念。此后&#xff0c;将电子器件微型化以生产细胞大小的机器人一直是科学家们追求的目标&#xff0c;但由于缺乏合适的微米级致动器系统&#xff0c;该技术一…