JAVA中的命令模式实例教程

原文链接  作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com>

命令模式是一种行为模式,因此,它处理的是对象的行为。命令模式为系统中不同的对象提供中性化的交流媒介。根据GoF的定义,命令模式是:


通过封装一组完全不相关的对象相互之间的的交互及通讯来完成松耦合。
允许某一个对象的行为的变化是独立于其他对象的。


在企业级应用中,命令模式是非常有用的,它使得多个对象可以相互交流。如果一些对象与另一些对象直接交流,系统组件之间是紧耦合的方式。这种方式导致系统具有更高的可维护性,可扩展的灵活性变得很低。命令模式专注于提供一个调解人介于需要交流的对象之间来帮助完成对象间的松耦合。

飞机流量控制器就是使用命令模式最好的例子。空管中心就是和这个负责不同飞机之间交流的调解人。调解人犹如一个不同对象之间的路由器,它有自己逻辑来提供对象之间如何交流。

在本文的例子中,我们试着完成一个聊天程序,允许群聊。用户使用自己的名字来识别,他们可以发送接收消息。任何人发送的消息都能被群组中的其他用户接收到。

调解人接口

首先创建调解人接口,用于如何定义具体的调解人。


package com.journaldev.design.mediator;public interface ChatMediator {public void sendMessage(String msg, User user);void addUser(User user);
}


 

组群用户接口

用户可以发送接送信息,因此应该有用户接口或者抽象类。此处创建用户抽象类如下:


package com.journaldev.design.mediator;public abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator med, String name){this.mediator=med;this.name=name;}public abstract void send(String msg);public abstract void receive(String msg);
}


注意用户有一个对调解人的索引,因为不同的用户需要交流。

调解人实体类

现在调解人的实体类,它包含了再组群中的一些类用户并且提供用户之间如何交流的逻辑。


package com.journaldev.design.mediator;import java.util.ArrayList;
import java.util.List;public class ChatMediatorImpl implements ChatMediator {private List<User> users;public ChatMediatorImpl(){this.users=new ArrayList<>();}@Overridepublic void addUser(User user){this.users.add(user);}@Overridepublic void sendMessage(String msg, User user) {for(User u : this.users){//message should not be received by the user sending itif(u != user){u.receive(msg);}}}}


组群用户的实体类

现在创建用户的实体类用于客户端中


package com.journaldev.design.mediator;public class UserImpl extends User {public UserImpl(ChatMediator med, String name) {super(med, name);}@Overridepublic void send(String msg){System.out.println(this.name+": Sending Message="+msg);mediator.sendMessage(msg, this);}@Overridepublic void receive(String msg) {System.out.println(this.name+": Received Message:"+msg);}}


注意,send()方法正在调解人中被用于传递信息给其他用户。但是它不知道如何被此调解人使用。

命令模式客户端

现在完成一个简单的聊天程序来完成组群聊天。


package com.journaldev.design.mediator;public class ChatClient {public static void main(String[] args) {ChatMediator mediator = new ChatMediatorImpl();User user1 = new UserImpl(mediator, "Pankaj");User user2 = new UserImpl(mediator, "Lisa");User user3 = new UserImpl(mediator, "Saurabh");User user4 = new UserImpl(mediator, "David");mediator.addUser(user1);mediator.addUser(user2);mediator.addUser(user3);mediator.addUser(user4);user1.send("Hi All");}}


注意,此客户端程序非常简单,完全没有给出细节描述信息是如何被处理以及调解人是否将会使用用户对象。

上述程序的输出如下:


Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All


命令模式的UML图

mediator-pattern

JDK中的命令模式

  • java.util.Timer类中scheduleXXX()方法
  • java Concurrency Executor execute() 方法
  • java.lang.reflect.Method invoke()方法

特别注意的地方

  • 命令模式中,当不同的对象的通讯逻辑很复杂是,我们可以使用中心化的交流方式来处理此通讯逻辑。
  • Java Message Service(JMS)消息服务与观察者模式一起来完成消息在不同程序间的订阅与发布。
  • 命令模式仅仅是为了松耦合。如果调解人的数量变大,此时易维护性就变差了。

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

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

相关文章

bugku 管理员系统 后台代码_不会吧,这也行?iOS后台锁屏监听摇一摇

[toc] 背景介绍 一般情况下&#xff0c;出于省电、权限、合理性等因素考虑&#xff0c;给人的感觉是很多奇怪的需求安卓可以实现&#xff0c;但是iOS就无法实现&#xff01;今天要介绍的需求也有这种感觉&#xff0c;就是“当 APP 处于后台或锁屏状态时&#xff0c;依旧可以监听…

windows php5.3升级,Windows10系统将PHPNOW升级PHP版本为5.3.5

Windows 10发布很久了&#xff0c;现在大多数人都在使用&#xff0c;在WIN10中使用PHPNOW&#xff0c;觉得自带的PHP版本有点低&#xff0c;所以就想升级下&#xff0c;在网上搜索了一些方法&#xff0c;然后结合自己的实际操作&#xff0c;在这里分享下。1、首先要下载PHP5.3.…

igs无法分配驱动器映射表_硬盘无法使用,用DiskPart进行分区和格式化,非常简单...

如果计算机硬盘出现问题&#xff0c;有时不是硬件上出现了错误&#xff0c;很可能只是逻辑上出现了问题&#xff0c;这时就可以使用DiskPart来快速解决。在Windows 10上&#xff0c;当外部存储(例如U盘、可移动硬盘或SD卡)由于数据损坏或其他问题而停止工作时&#xff0c;可以使…

硬件nat关闭还是开启_超能课堂(173):AfterBurner不止超频,还是绝佳的游戏伴侣...

微星AfterBurner软件可以说是一个相当好用的显卡工具&#xff0c;它好用的超频功能估计都不用我多说了吧&#xff1f;微星并没有把这款软件限制在自己品牌的显卡能用&#xff0c;各个品牌的显卡都能用&#xff0c;无论A卡还是N卡都可以用AfterBurner来超频&#xff0c;软件在超…

mx350显卡天梯图_CPU天梯图与显卡天梯图2020年最新版

最新CPU天梯图较之以往没有太大的变化&#xff0c;前十位置还是那几款。但是继阿里之后&#xff0c;腾讯也开始准备自己制作芯片了&#xff0c;毕竟自研AI芯片的诱惑还是很大的&#xff0c;2020年有不少的厂商都推出了新鲜美味的显卡&#xff0c;有些是老卡翻新做性价比。有的则…

matlab写字,Matlab实现鼠标写字代码

类型&#xff1a;编程工具大小&#xff1a;1.5M语言&#xff1a;中文 评分&#xff1a;1.2标签&#xff1a;立即下载最早的程序&#xff0c;实在忘了从哪里下载的了。能够实现鼠标的手写输入&#xff0c;但是一些不连续的点。tmouse.mfunction tmouse(action)% TMOUSE 本例展示…

from rfc 2068 hypertext怎么解决_你好,打工人!用英语怎么表达“打工人”?可别直接说 worker...

打工人&#xff0c;打工魂&#xff0c;打工人是人上人&#xff01;最近&#xff0c;「打工人」这个词火了&#xff01;几乎一夜之间&#xff0c;很多人在和朋友打招呼时&#xff0c;都自称“打工人”。那“打工人”是什么意思&#xff1f;这里的“打工人”&#xff0c;其实是对…

STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续)

前言大概半个月之前捣鼓了下利用STM32实现实时曲线显示&#xff0c;中间又做了一点小改进和扩充&#xff0c;在这里更新一下&#xff1a;利用DMA进行缓冲区到LCD GRAM的像素数据搬运效果更好的曲线绘制策略代码可以在这里找到&#xff1a;<写得比较乱&#xff0c;望谅解( &a…

Vmware虚拟机三种网络模式详解

原文来自http://note.youdao.com/share/web/file.html?id236896997b6ffbaa8e0d92eacd13abbf&typenote 我怕链接会失效&#xff0c;故转载此篇文章。通过这篇文章&#xff0c;我对之前疑惑的地方有了直观的理解&#xff0c;很多地方并没有自己动手实践&#xff0c;所以这篇…

ros 双wan配置_基于ROS搭建简易软件框架实现ROV水下目标跟踪(九)--程序解析之PWM波下发...

模块对应cabin_controllers/serial_to_mcu。模块实现的功能为监听网络中PWM矩阵信息&#xff0c;将其转换成十六进制数据通过串口下发至MCU&#xff0c;实现对推进器电机的控制。模块数据的串口通信借助了ros的serial工具包&#xff08;sudo apt-get install ros-melodic-seria…

2018php项目实战视频教程,2018PHP实战技术VIP在线学习视频课程

课程目录&#xff1a;1-1 疯狂讲义之web简介2-1 从搭建PHP开发环境开始2-2 第一个PHP程序2-3 PHP变量相关知识2-4 PHP数据类型2-5 PHP数据类型之进制转换2-6 PHP数据类型之浮点型2-7 PHP数据类型系统函数简介3-1 PHP数据类型字符串的声明与定义3-2 数据类型之数组、资源、null类…

Struts1.x在MyEclipse中的环境搭建和配置

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;一&#xff09; 先解压Struts-1.3.10-all.zip的文件夹Struts-1.3.10-all备用 -> 打开MyEclipse -> 新建一个 web project -> 在工程名上按右键鼠标选 Properties -> 弹出 Properties 面板 …

iphone固件降级_iPhone无法开机怎么办?三种快速维修方法

苹果手机的流畅让许多用户为之买单&#xff0c;但毕竟是电子产品&#xff0c;难免会有一些故障&#xff0c;其中无法开机就是一个很头疼的问题&#xff0c;一方面担心手机报废&#xff0c;一方面担心修理费过高&#xff0c;而造成 iPhone 无法开机的原因有很多&#xff0c;这里…

strspn函数php,php strspn函数怎么用?

strspn()函数是PHP中的一个内置函数&#xff0c;语法为strspn(string,charlist,start,length)&#xff0c;用于返回在字符串中包含 charlist 参数中指定字符的数目。php strspn()函数怎么用&#xff1f;strspn() 函数返回在字符串中包含 charlist 参数中指定的字符数目。语法&a…

【转载】架构师需要了解的Paxos原理、历程及实战

原文链接&#xff0c;请参见&#xff1a;http://weibo.com/ttarticle/p/show?id2309403952892003376258 数据库高可用性难题 数据库的数据一致和持续可用对电子商务和互联网金融的意义不言而喻&#xff0c;而这些业务在使用数据库时&#xff0c;无论 MySQL 还是 Oracle&#x…

酷冷至尊官方psu计算工具_酷冷至尊为Raspberry Pi推出Pi Case 40机壳,提供被动散热、卖27美元起...

Raspberry Pi(树莓派)是众所周知的廉价Single Board Computer&#xff0c;虽然名字里面有个“电脑”&#xff0c;但与我们一般广泛认知的台式机不同&#xff0c;它基本都是裸着一块主机板来使用&#xff0c;显得很极客、创客&#xff0c;当然也还是有一些玩家自制或者小作坊给R…

一个websocket 可以多个页面创建吗_实战分享|给我一个Puppeteer,没有爬不了的网站

Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包&#xff0c;用来模拟 Chrome 浏览器的运行。我们团队从 Puppeteer 刚发布出来就开始成为忠实用户了(主要是因为 PhantomJs 坑太多了)&#xff0c;本文主要在介绍 Puppeteer 的同时&#xff0c;结合我们平时的实践…

c++ 工厂模式_大连中山融雪剂工厂自营工厂批发

摘要&#xff1a; 大连中山融雪剂工厂自营工厂大连中山 源头工厂一站式采购 直发 大量库存 优势柠檬酸 欢迎选购 柠檬酸(Citric Acid&#xff0c;简称CA)是一种重要的有机酸&#xff0c;又名枸橼酸&#xff0c;分子式C₆H₈O₇&#xff0c;无色晶体&#xff0c;常含一分子结晶水…

开源Registry项目Harbor源代码结构解析

2019独角兽企业重金招聘Python工程师标准>>> 上周我们介绍了Harbor开源企业级容器Registry的架构&#xff0c;获得了社区很多朋友的反馈和建议&#xff0c;再次一并感谢&#xff0c;希望和大家一起&#xff0c;共同建设一个优秀的开源项目。本文请Harbor项目工程师尹…

苹果怎么关闭系统自动更新_你经过我的同意了吗?论手机系统自动更新

说起手机系统的更新&#xff0c;相信大致是有两个党派&#xff0c;一个是有出必追&#xff0c;第一时间更新到最新系统&#xff0c;体验新特性&#xff0c;修复已知BUG&#xff0c;二就是保守派&#xff0c;认为买来时自带的系统版本即是最好用的&#xff0c;不喜升级&#xff…