天天看點

JAVA中的指令模式執行個體教程

指令模式是一種行為模式,是以,它處理的是對象的行為。指令模式為系統中不同的對象提供中性化的交流媒介。根據gof的定義,指令模式是:

在企業級應用中,指令模式是非常有用的,它使得多個對象可以互相交流。如果一些對象與另一些對象直接交流,系統元件之間是緊耦合的方式。這種方式導緻系統具有更高的可維護性,可擴充的靈活性變得很低。指令模式專注于提供一個調解人介于需要交流的對象之間來幫助完成對象間的松耦合。

飛機流量控制器就是使用指令模式最好的例子。空管中心就是和這個負責不同飛機之間交流的調解人。調解人猶如一個不同對象之間的路由器,它有自己邏輯來提供對象之間如何交流。

在本文的例子中,我們試着完成一個聊天程式,允許群聊。使用者使用自己的名字來識别,他們可以發送接收消息。任何人發送的消息都能被群組中的其他使用者接收到。

首先建立調解人接口,用于如何定義具體的調解人。

<code>1</code>

<code>package</code> <code>com.journaldev.design.mediator;</code>

<code>2</code>

<code>3</code>

<code>public</code> <code>interface</code> <code>chatmediator {</code>

<code>4</code>

<code>5</code>

<code>    </code><code>public</code> <code>void</code> <code>sendmessage(string msg, user user);</code>

<code>6</code>

<code>7</code>

<code>    </code><code>void</code> <code>adduser(user user);</code>

<code>8</code>

<code>}</code>

使用者可以發送接送資訊,是以應該有使用者接口或者抽象類。此處建立使用者抽象類如下:

<code>01</code>

<code>02</code>

<code>03</code>

<code>public</code> <code>abstract</code> <code>class</code> <code>user {</code>

<code>04</code>

<code>    </code><code>protected</code> <code>chatmediator mediator;</code>

<code>05</code>

<code>    </code><code>protected</code> <code>string name;</code>

<code>06</code>

<code>07</code>

<code>    </code><code>public</code> <code>user(chatmediator med, string name){</code>

<code>08</code>

<code>        </code><code>this</code><code>.mediator=med;</code>

<code>09</code>

<code>        </code><code>this</code><code>.name=name;</code>

<code>10</code>

<code>    </code><code>}</code>

<code>11</code>

<code>12</code>

<code>    </code><code>public</code> <code>abstract</code> <code>void</code> <code>send(string msg);</code>

<code>13</code>

<code>14</code>

<code>    </code><code>public</code> <code>abstract</code> <code>void</code> <code>receive(string msg);</code>

<code>15</code>

注意使用者有一個對調解人的索引,因為不同的使用者需要交流。

現在調解人的實體類,它包含了再組群中的一些類使用者并且提供使用者之間如何交流的邏輯。

<code>import</code> <code>java.util.arraylist;</code>

<code>import</code> <code>java.util.list;</code>

<code>public</code> <code>class</code> <code>chatmediatorimpl </code><code>implements</code> <code>chatmediator {</code>

<code>    </code><code>private</code> <code>list&lt;user&gt; users;</code>

<code>    </code><code>public</code> <code>chatmediatorimpl(){</code>

<code>        </code><code>this</code><code>.users=</code><code>new</code> <code>arraylist&lt;&gt;();</code>

<code>    </code><code>@override</code>

<code>    </code><code>public</code> <code>void</code> <code>adduser(user user){</code>

<code>16</code>

<code>        </code><code>this</code><code>.users.add(user);</code>

<code>17</code>

<code>18</code>

<code>19</code>

<code>20</code>

<code>    </code><code>public</code> <code>void</code> <code>sendmessage(string msg, user user) {</code>

<code>21</code>

<code>        </code><code>for</code><code>(user u : </code><code>this</code><code>.users){</code>

<code>22</code>

<code>            </code><code>//message should not be received by the user sending it</code>

<code>23</code>

<code>            </code><code>if</code><code>(u != user){</code>

<code>24</code>

<code>                </code><code>u.receive(msg);</code>

<code>25</code>

<code>            </code><code>}</code>

<code>26</code>

<code>        </code><code>}</code>

<code>27</code>

<code>28</code>

<code>29</code>

現在建立使用者的實體類用于用戶端中

<code>public</code> <code>class</code> <code>userimpl </code><code>extends</code> <code>user {</code>

<code>    </code><code>public</code> <code>userimpl(chatmediator med, string name) {</code>

<code>        </code><code>super</code><code>(med, name);</code>

<code>    </code><code>public</code> <code>void</code> <code>send(string msg){</code>

<code>        </code><code>system.out.println(</code><code>this</code><code>.name+</code><code>": sending message="</code><code>+msg);</code>

<code>        </code><code>mediator.sendmessage(msg, </code><code>this</code><code>);</code>

<code>    </code><code>public</code> <code>void</code> <code>receive(string msg) {</code>

<code>        </code><code>system.out.println(</code><code>this</code><code>.name+</code><code>": received message:"</code><code>+msg);</code>

注意,send()方法正在調解人中被用于傳遞資訊給其他使用者。但是它不知道如何被此調解人使用。

現在完成一個簡單的聊天程式來完成組群聊天。

<code>public</code> <code>class</code> <code>chatclient {</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>

<code>        </code><code>chatmediator mediator = </code><code>new</code> <code>chatmediatorimpl();</code>

<code>        </code><code>user user1 = </code><code>new</code> <code>userimpl(mediator, </code><code>"pankaj"</code><code>);</code>

<code>        </code><code>user user2 = </code><code>new</code> <code>userimpl(mediator, </code><code>"lisa"</code><code>);</code>

<code>        </code><code>user user3 = </code><code>new</code> <code>userimpl(mediator, </code><code>"saurabh"</code><code>);</code>

<code>        </code><code>user user4 = </code><code>new</code> <code>userimpl(mediator, </code><code>"david"</code><code>);</code>

<code>        </code><code>mediator.adduser(user1);</code>

<code>        </code><code>mediator.adduser(user2);</code>

<code>        </code><code>mediator.adduser(user3);</code>

<code>        </code><code>mediator.adduser(user4);</code>

<code>        </code><code>user1.send(</code><code>"hi all"</code><code>);</code>

注意,此用戶端程式非常簡單,完全沒有給出細節描述資訊是如何被處理以及調解人是否将會使用使用者對象。

上述程式的輸出如下:

<code>pankaj: sending message=hi all</code>

<code>lisa: received message:hi all</code>

<code>saurabh: received message:hi all</code>

<code>david: received message:hi all</code>

JAVA中的指令模式執行個體教程

java.lang.reflect.method invoke()方法

指令模式中,當不同的對象的通訊邏輯很複雜是,我們可以使用中心化的交流方式來處理此通訊邏輯。

java message service(jms)消息服務與觀察者模式一起來完成消息在不同程式間的訂閱與釋出。

指令模式僅僅是為了松耦合。如果調解人的數量變大,此時易維護性就變差了。