博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA中的命令模式实例教程
阅读量:6338 次
发布时间:2019-06-22

本文共 2903 字,大约阅读时间需要 9 分钟。

  作者: 译者: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
users; public ChatMediatorImpl(){ this.users=new ArrayList<>(); } @Override public void addUser(User user){ this.users.add(user); } @Override public void sendMessage(String msg, User user) { for(User u : this.users){ //message should not be received by the user sending it if(u != user){ u.receive(msg); } } }}

组群用户的实体类

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

package com.journaldev.design.mediator;public class UserImpl extends User {	public UserImpl(ChatMediator med, String name) {		super(med, name);	}	@Override	public void send(String msg){		System.out.println(this.name+": Sending Message="+msg);		mediator.sendMessage(msg, this);	}	@Override	public 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 AllLisa: Received Message:Hi AllSaurabh: Received Message:Hi AllDavid: Received Message:Hi All

命令模式的UML图

mediator-pattern

JDK中的命令模式

  • 类中scheduleXXX()方法
  •  execute() 方法
  • java.lang.reflect.Method invoke()方法

特别注意的地方

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

转载地址:http://qaooa.baihongyu.com/

你可能感兴趣的文章
第二十四章:页面导航(六)
查看>>
百度、长沙加码自动驾驶,湖南阿波罗智行科技公司成立 ...
查看>>
10 个 Linux 中方便的 Bash 别名
查看>>
全新 DOCKER PALS 计划上线,带给您不一样的参会体验! ...
查看>>
Android开发之自定义View(二)
查看>>
python爬虫之微打赏(scrapy版)
查看>>
自制操作系统Antz day08——实现内核 (中) 扩展内核
查看>>
poj-1056-IMMEDIATE DECODABILITY(字典)
查看>>
区块链应用 | 不知道什么时候起,满世界都在谈区块链的事情
查看>>
小程序爆红 专家:对简单APP是巨大打击
查看>>
FarBox--另类有趣的网站服务【转】
查看>>
在非纯色背景上,叠加背景透明的BUTTON和STATIC_TEXT控件
查看>>
Distributed2:Linked Server Login 添加和删除
查看>>
Java中取两位小数
查看>>
使用 ftrace 调试 Linux 内核【转】
查看>>
唯一聚集索引上的唯一和非唯一非聚集索引
查看>>
Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark...
查看>>
linux磁盘配额
查看>>
NFS文件共享服务器的搭建
查看>>
%r 和 %s 该用哪个?
查看>>