• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 從命令模式(Command)看編程

    發表于:2013-09-01來源:Csdn作者:shuangde800點擊數: 標簽:命令模式
    從命令模式(Command)看編程 走進命令模式 在餐廳的情境中,我們看看餐廳是怎樣工作的: 1、顧客走進餐廳,點好菜后,生成訂單交給女服務員。

      走進命令模式

      在餐廳的情境中,我們看看餐廳是怎樣工作的:

      1、顧客走進餐廳,點好菜后,生成訂單交給女服務員。

      2、女服務員把訂單拿到廚房工作室,大喊一聲:“訂單來了!”

      3、廚師訂單準備餐點。

      上面情境各角色職責:

      1、訂單封裝了顧客的請求。 和一般的對象一樣,訂單可以被傳遞,訂單內包含一個方法 orderUp(), 這個方法封裝了準備餐點所需的動作。訂單內有廚師的引用。這些都被封裝起來。

      2、女服務員的工作就是接受訂單,然后調用訂單的orderUp( )方法。這里的orderUp具體內容就是把訂單交給廚師。

      女服務員不必知道訂單的內容是什么,只需要知道訂單中有一個orderUp( )的方法可以調用就夠了。

      3、廚師具備準備餐點的知識

      廚師是一種對象,他真正知道如何準備餐點。一旦女服務員調用orderUp( )方法,廚師就接手馬上做好餐點。

      女服務員和廚師之間的關系是徹底解耦的,請注意,女服務員的訂單封裝了餐點的細節,她只要調用訂單的方法即可,而廚師看了訂單就知道該做什么餐點,廚師和女服務員之間從來不用直接溝通。

      從餐廳到命令模式

      把餐廳想象成OO設計模式中的一種模型,這個模型允許將“發出的請求的對象”和“接受與執行這些請求的對象”分隔開來。

      比方說,對于遙控器的例子:

      有一個遙控器

      上面有不同功能的卡槽,旁邊對應卡槽的開關按鈕,遙控器廠商提供了相關卡槽功能的類。如何設計這個遙控器的API?

      對于遙控器API,我們需要分隔開“發出請求的的按鈕代碼”和執行請求的"廠商特定對象"。

      假設遙控器插槽上有一個餐廳訂單的對象,那么按按鈕,就會調用該對象的orderUp()方法,然后就可以等待大餐上來了!

      命令模式可以將“動作的請求者”從動作的執行者對象中解耦。上面遙控器是請求者,而執行者對象就是廠商類的其中之一的實例。

      利用命令模式把遙控器每個鍵的請求封裝成一個特定對象,所以,每個按鈕都存儲一個命令對象,那么當按下按鈕時,就可以請命令對象做相關的工作。遙控器并不需要知道工作內容是什么,只要有這個命令對象就能和正確的對象溝通,把事情做好就可以了。

      第一個命令對象

      下面用命令模式實現遙控器的代碼

      1. 實現命令接口

      [java] view plaincopy// 命令接口,所有的命令對象實現這個接口

      public interface Command {

      // 簡單! 只需要一個方法:execute()

      public void execute();

      }

      2. 實現一個打開電燈的命令

      [java] view plaincopy// 實現一個打開電燈的命令

      // 要實現Command的接口

      public class LightOnCommand implements Command{

      Light light;

      // light是接收者

      public LightOnCommand(Light light) {

      this.light = light;

      }

      // 執行接收者的動作

      public void execute() {

      light.on();

      }

      }

      3. 使用命令對象

      下面是調用者

      [java] view plaincopypublic class SimpleRemoteControl{

      // 有一個插槽持有命令,而這個命令控制著一個裝置

      Command slot;

      public SimpleRemoteControl() { }

      // 這個方法用來設置插槽控制的命令。

      // 如果這段代碼的客戶想要改變

      public void setCommand(Command command) {

      slot = command;

      }

      // 當按下按鈕時,這個方法就會被調用

      // 使得當前命令銜接插槽,并調用他的execute()方法

      public void buttonWasPressed() {

      slot.execute();

      }

      }

      4. 遙控器使用的簡單測試

      下面代碼,用來測試上面的簡單遙控器

      [java] view plaincopypublic class RemoteControlTest {//這是命令模式的客戶

      public static void main(String[] args) {

      // 遙控器就是調用者,會傳入一個命令對象,可以用來發出請求

      SimpleRemoteControl remote = new SimpleRemoteControl();

      // 創建一個電燈對象,此對象是接收者

      Light light = new Light();

      // 這里創建一個命令,然后接收者傳給他

      LightOnCommand lightOn = new LightOnCommand(light);

      // 把命令傳給調用者

      remote.setCommand(lightOn);

      // 模擬按下按鈕

      remote.buttonWasPressed();

      }

      }

      定義命令模式

      命令模式將“請求”封裝成對象,以便使用不同的請求,隊列或者日志來參數化其他對象。命令模式也支持可撤銷的操作

    原文轉自:http://blog.csdn.net/shuangde800/article/details/9840259

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>