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.…

在Microsoft Word中,Node是如何替代宏的

最近的30年来&#xff0c;宏&#xff08;macros&#xff09;成为了Microsoft Word的关键卖点。WordBASIC最初是在1989年引入的&#xff0c;它能够让受过极少培训的打字员都能进行计算机编程&#xff0c;从而简化他们的日常工作。\\在那个时代&#xff0c;竞争非常激烈。除了Wor…

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

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

java随机生成1到33数组,JAVA 生成随机数数组

一、JAVA获取随机数的方法//使用java.lang.Math类的random()方法double a Math.random();System.out.println("0.0-1.0的随机数&#xff1a;" a);double b Math.random()*100;System.out.println("0.0-100.0的随机数&#xff1a;" b);int c (int)(Mat…

线性筛法求素数

求素数是比较基本的内容&#xff0c;有时候我们会需要打一个素数表。一般如果n比较小我们会使用&#xff08;%2~sqrtn&#xff09;这种算法&#xff0c;简单但是时间耗费很多&#xff0c;复杂度是O(n^2)。这里介绍一种筛选求素数法&#xff0c;基本要点是&#xff0c;如果找到一…

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

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

java dataset redis,利用Spring-Data-Redis和Jedis操作Redis缓存

概述 Jedis是redis官方推荐的用于访问Java客户端&#xff0c;在https://github.com/xetorthio/jedis下载最新的jedis。 访问redis 1、访问简单的key——value&#xff0c; pu只需简单几步&#xff0c;就可以利用Spring-Data-Redis和Jedis操作Redis缓存。步骤如下&…

javascript Array学习与使用

一&#xff0e;Javascript数组是无类型的&#xff1b;数组元素可以任意类型&#xff0c;并且同一个数组中的不同元素也可能有不同的类型&#xff0c;javascript数组是动态的&#xff0c;会根据需要增长或者缩减&#xff0c;每一个数组都有一个length属性。它不是只读的&#xf…

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 本例展示…

[Linux]变量加减赋值以及将String转int

teddytoshiba~$ a"76"teddytoshiba~$ echo $((a3))79teddytoshiba~$ echo $((a-12))64teddytoshiba~$取文件名以及文件路径的脚本&#xff1a;#!/bin/shtmp$1filenameecho $1 | awk -F/ {print $(NF)}echo "filename":$filenamefilenamelengthecho | awk …

matlab在绘图时分数,第三章_Matlab图形绘制试卷.ppt

2、griddata函数&#xff0c;用来产生经插值后均匀间隔数据作图。常用的调用方法是&#xff1a;[XI,YI,ZI] griddata(x,y,z,XI,YI,’method’)&#xff0c;其中x,y,z来自关系式zf(x,y)&#xff0c;也可以是离散的数据点&#xff0c;ZI是有XI和YI插值后得到的对应点。其中metho…

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

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

fbset

fbset用于读取和设置framebuffer的参数。# fbset mode "800x480-112"# D: 64.998 MHz, H: 58.034 kHz, V: 112.035 Hzgeometry 800 480 800 480 16timings 15385 220 40 21 7 60 10accel falsergba 5/11,6/5,5/0,0/0 endmode

mysql中更新的命令是,mysql命令总结(陆续更新中)

批量mysql 数据导入 load data local infile xx into table xx;连接数据库&#xff1a;mysql -h hostname -P port -u username -p -D databasename查看提供什么存储引擎&#xff1a;show engines;查看当前引擎&#xff1a;show variables like %storage_engine%;查看表使用了…

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类…