JAVA中的命令模式实例教程

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

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

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

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

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

调解人接口

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

1 package com.journaldev.design.mediator;
2  
3 public interface ChatMediator {
4  
5     public void sendMessage(String msg, User user);
6  
7     void addUser(User user);
8 }

 

组群用户接口

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

01 package com.journaldev.design.mediator;
02  
03 public abstract class User {
04     protected ChatMediator mediator;
05     protected String name;
06  
07     public User(ChatMediator med, String name){
08         this.mediator=med;
09         this.name=name;
10     }
11  
12     public abstract void send(String msg);
13  
14     public abstract void receive(String msg);
15 }

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

调解人实体类

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

01 package com.journaldev.design.mediator;
02  
03 import java.util.ArrayList;
04 import java.util.List;
05  
06 public class ChatMediatorImpl implements ChatMediator {
07  
08     private List<User> users;
09  
10     public ChatMediatorImpl(){
11         this.users=new ArrayList<>();
12     }
13  
14     @Override
15     public void addUser(User user){
16         this.users.add(user);
17     }
18  
19     @Override
20     public void sendMessage(String msg, User user) {
21         for(User u : this.users){
22             //message should not be received by the user sending it
23             if(u != user){
24                 u.receive(msg);
25             }
26         }
27     }
28  
29 }

组群用户的实体类

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

01 package com.journaldev.design.mediator;
02  
03 public class UserImpl extends User {
04  
05     public UserImpl(ChatMediator med, String name) {
06         super(med, name);
07     }
08  
09     @Override
10     public void send(String msg){
11         System.out.println(this.name+": Sending Message="+msg);
12         mediator.sendMessage(msg, this);
13     }
14     @Override
15     public void receive(String msg) {
16         System.out.println(this.name+": Received Message:"+msg);
17     }
18  
19 }

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

命令模式客户端

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

01 package com.journaldev.design.mediator;
02  
03 public class ChatClient {
04  
05     public static void main(String[] args) {
06         ChatMediator mediator = new ChatMediatorImpl();
07         User user1 = new UserImpl(mediator, "Pankaj");
08         User user2 = new UserImpl(mediator, "Lisa");
09         User user3 = new UserImpl(mediator, "Saurabh");
10         User user4 = new UserImpl(mediator, "David");
11         mediator.addUser(user1);
12         mediator.addUser(user2);
13         mediator.addUser(user3);
14         mediator.addUser(user4);
15  
16         user1.send("Hi All");
17  
18     }
19  
20 }

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

上述程序的输出如下:

1 Pankaj: Sending Message=Hi All
2 Lisa: Received Message:Hi All
3 Saurabh: Received Message:Hi All
4 David: Received Message:Hi All

命令模式的UML图

JDK中的命令模式

特别注意的地方

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

JAVA中的命令模式实例教程的相关文章

Java中的状态模式实例教程

原文链接 作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 状态模式是一种行为设计模式.适用于当对象的内在状态改变它自身的行为时. 如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为.状态模式Context(环境)和State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的. Context是包含了状态引用的类,此引用指向一个状态的具体实现.并且帮助把对状态的请求委

Java中的策略模式实例教程

策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数.使用这种模式最好的例子是Collection.sort()方法了,它使用Comparator对象作为参数.根据Comparator接口不同实现,对象会被不同的方法排序.详细介绍请看java中的排序对象. 本文例子是,完成一个简单地购物车,两种付款策略可供选择,一为信用卡,另

JAVA中的备忘录模式实例教程

备忘录模式是一种行为模式.备忘录模式用于保存对象当前状态,并且在之后可以再次使用此状态.备忘录模式实现的方式需要保证,被保存的对象状态不能被对象从外部访问,目的为了被保存的这些对象状态的完整性. 备忘录模式通过两个对象实现:Originator以及Caretaker.Originator类代表了其状态能够被存储并被用于恢复之前的状态,它使用内部类保存对象的状态.此内部类就被叫做备忘录,注意此类是私有的,它不能被其他对象访问. Caretaker是一个帮助类,它的职责就是通过备忘录帮助Origin

实例讲解设计模式中的命令模式在iOS App开发中的运用_IOS

命令模式封装一个请求或行为作为一个对象.封装的请求比原的更加灵活,可以在对象之间传递,储存,动态修改,或放入一个队列. 那么让我们简要的说一下命令模式的特点. 它能比较容易地设计一个命令队列: 在需要的情况下,可以较容易地将命令记入日志: 允许接收请求地一方决定是否要否决请求: 可以容易地实现对请求地撤销和重做: 由于加进新地具体命令类不影响其他的类,因此增加新的具体命令类很容易: 把请求一个操作的对象与知道怎么执行一个操作的对象分隔开. 下面给出基本的类结构图: 上面这张图是命令模式的类结构的

java中的工厂模式

举两个例子以快速明白Java中的工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色.         2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象

Java中实现文件拷实例

Java中实现文件拷实例 import java.io.*; class copy_file { public static void copyfile(String path1,String path2) throws IOException //使用FileInputStream和FileOutStream { FileInputStream fi=new FileInputStream(path1); FileOutputStream fo=new FileOutputStream(pat

java中jar命令如何将指定的class文件更新到_指定的目录_

问题描述 java中jar命令如何将指定的class文件更新到_指定的目录_一定是指定的目录在网上查了一下,貌似是jarufeee.jarhhh.class这个只能将hhh.class这个文件更新到eee.jar的根目录,我想要的是如何将eee.jar更新到指定的目录. 解决方案 解决方案二:C:Userszz192672>jar用法:jar{ctxui}[vfm0Me][jar-file][manifest-file][entry-point][-Cdir]files...选项包括:-c创建新

java设计模式_命令模式 两个不同风格的实现

   Command模式(命令)  Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Command(命令模式)模式是比较常用的一个模式.    Command命令模式:Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数.将一个请求封装为一个对象,从而使你不同的请求对客户进行参数化:对请求排队或

Android App中使用ListFragment的实例教程_Android

ListFragment继承于Fragment.因此它具有Fragment的特性,能够作为activity中的一部分,目的也是为了使页面设计更加灵活. 相比Fragment,ListFragment的内容是以列表(list)的形式显示的.ListFragment的布局默认包含一个ListView.因此,在ListFragment对应的布局文件中,必须指定一个 android:id 为 "@android:id/list" 的ListView控件! ListFragment基础使用下面介