閱讀141 返回首頁    go iPhone_iPad_Mac_apple


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圖

mediator-pattern

JDK中的命令模式

特別注意的地方

  • 命令模式中,當不同的對象的通訊邏輯很複雜是,我們可以使用中心化的交流方式來處理此通訊邏輯。
  • Java Message Service(JMS)消息服務與觀察者模式一起來完成消息在不同程序間的訂閱與發布。
  • 命令模式僅僅是為了鬆耦合。如果調解人的數量變大,此時易維護性就變差了。
  • 轉載自 並發編程網 - ifeve.com

最後更新:2017-05-23 11:02:59

  上一篇:go  Java IO: 字符流的Buffered和Filter
  下一篇:go  volatile是否能保證數組中元素的可見性?