生活随笔
收集整理的這篇文章主要介紹了
JAVA中的命令模式实例教程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原文鏈接??作者:Pankaj Kumar?譯者:f0tlo <1357654289@qq.com>
命令模式 是一種行為模式 ,因此,它處理的是對(duì)象的行為。命令模式為系統(tǒng)中不同的對(duì)象提供中性化的交流媒介。根據(jù)GoF的定義,命令模式是:
通過(guò)封裝一組完全不相關(guān)的對(duì)象相互之間的的交互及通訊來(lái)完成松耦合。
允許某一個(gè)對(duì)象的行為的變化是獨(dú)立于其他對(duì)象的。
在企業(yè)級(jí)應(yīng)用中,命令模式是非常有用的,它使得多個(gè)對(duì)象可以相互交流。如果一些對(duì)象與另一些對(duì)象直接交流,系統(tǒng)組件之間是緊耦合的方式。這種方式導(dǎo)致系統(tǒng)具有更高的可維護(hù)性,可擴(kuò)展的靈活性變得很低。命令模式專注于提供一個(gè)調(diào)解人介于需要交流的對(duì)象之間來(lái)幫助完成對(duì)象間的松耦合。
飛機(jī)流量控制器就是使用命令模式最好的例子。空管中心就是和這個(gè)負(fù)責(zé)不同飛機(jī)之間交流的調(diào)解人。調(diào)解人猶如一個(gè)不同對(duì)象之間的路由器,它有自己邏輯來(lái)提供對(duì)象之間如何交流。
在本文的例子中,我們?cè)囍瓿梢粋€(gè)聊天程序,允許群聊。用戶使用自己的名字來(lái)識(shí)別,他們可以發(fā)送接收消息。任何人發(fā)送的消息都能被群組中的其他用戶接收到。
調(diào)解人接口 首先創(chuàng)建調(diào)解人接口,用于如何定義具體的調(diào)解人。
package com.journaldev.design.mediator;public interface ChatMediator {public void sendMessage(String msg, User user);void addUser(User user);
}
?
組群用戶接口 用戶可以發(fā)送接送信息,因此應(yīng)該有用戶接口或者抽象類。此處創(chuàng)建用戶抽象類如下:
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);
}
注意用戶有一個(gè)對(duì)調(diào)解人的索引,因?yàn)椴煌挠脩粜枰涣鳌?/p>
調(diào)解人實(shí)體類 現(xiàn)在調(diào)解人的實(shí)體類,它包含了再組群中的一些類用戶并且提供用戶之間如何交流的邏輯。
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);}}}}
組群用戶的實(shí)體類 現(xiàn)在創(chuàng)建用戶的實(shí)體類用于客戶端中
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()方法正在調(diào)解人中被用于傳遞信息給其他用戶。但是它不知道如何被此調(diào)解人使用。
命令模式客戶端 現(xiàn)在完成一個(gè)簡(jiǎn)單的聊天程序來(lái)完成組群聊天。
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");}}
注意,此客戶端程序非常簡(jiǎn)單,完全沒(méi)有給出細(xì)節(jié)描述信息是如何被處理以及調(diào)解人是否將會(huì)使用用戶對(duì)象。
上述程序的輸出如下:
Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All
命令模式的UML圖
JDK中的命令模式 java.util.Timer類中scheduleXXX()方法 java Concurrency Executor?execute() 方法 java.lang.reflect.Method invoke()方法 特別注意的地方 命令模式中,當(dāng)不同的對(duì)象的通訊邏輯很復(fù)雜是,我們可以使用中心化的交流方式來(lái)處理此通訊邏輯。 Java Message Service(JMS)消息服務(wù)與觀察者模式一起來(lái)完成消息在不同程序間的訂閱與發(fā)布。 命令模式僅僅是為了松耦合。如果調(diào)解人的數(shù)量變大,此時(shí)易維護(hù)性就變差了。
總結(jié)
以上是生活随笔 為你收集整理的JAVA中的命令模式实例教程 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。