久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    java命令模式

     昵稱8442 2012-12-16

    1.概念

      將來自客戶端的請求傳入一個對象,從而使你可用不同的請求對客戶進行參數化。用于“行為請求者”與“行為實現者”解耦,可實現二者之間的松耦合,以便適應變化。分離變化與不變的因素。

       在面向對象的程序設計中,一個對象調用另一個對象,一般情況下的調用過程是:創建目標對象實例;設置調用參數;調用目標對象的方法。

    但在有些情況下有必要使用一個專門的類對這種調用過程加以封裝,我們把這種專門的類稱作command類。

    Command模式可應用于
    a)整個調用過程比較繁雜,或者存在多處這種調用。這時,使用Command類對該調用加以封裝,便于功能的再利用。
    b)調用前后需要對調用參數進行某些處理。
    c)調用前后需要進行某些額外處理,比如日志,緩存,記錄歷史操作等。

    Command模式有如下效果:
    a)將調用操作的對象和知道如何實現該操作的對象解耦。
    b)Command是頭等對象。他們可以像其他對象一樣被操作和擴展。
    c)你可將多個命令裝配成一個符合命令。
    d)增加新的Command很容易,因為這無需改變現有的類。

     

    2.UML

    3.代碼

    復制代碼
    復制代碼
    public interface Command {
    public void execute();
    }


    public class ConcreteCommand implements Command {

    private Receiver receiver = null;
    private String state;

    public ConcreteCommand(Receiver receiver){
    this.receiver = receiver;
    }
    public void execute() {
    receiver.action();
    }
    }


    public class Receiver {
    public void action(){
    //真正執行命令操作的功能代碼
    }
    }


    public class Invoker {
    private Command command = null;

    public void setCommand(Command command) {
    this.command = command;
    }

    public void runCommand() {
    command.execute();
    }
    }

    public class Client {
    public void assemble(){
    //創建接收者
    Receiver receiver = new Receiver();
    //創建命令對象,設定它的接收者
    Command command = new ConcreteCommand(receiver);
    //創建Invoker,把命令對象設置進去
    Invoker invoker = new Invoker();
    invoker.setCommand(command);
    }
    }
    復制代碼
    復制代碼
    復制代碼
    復制代碼
    下面給個例子,是模擬對電視機的操作有開機、關機、換臺命令。代碼如下

    //命令接收者
    public class Tv {
      public int currentChannel = 0;

      public void turnOn() {
       System.out.println("The televisino is on.");
      }

      public void turnOff() {
       System.out.println("The television is off.");
      }

      public void changeChannel(int channel) {
       this.currentChannel = channel;
       System.out.println("Now TV channel is " + channel);
      }
    }

    //執行命令的接口
    public interface Command {
      void execute();
    }

    //開機命令
    public class CommandOn implements Command {
      private Tv myTv;

      public CommandOn(Tv tv) {
       myTv = tv;
      }

      public void execute() {
       myTv.turnOn();
      }
    }

    //關機命令
    public class CommandOff implements Command {
      private Tv myTv;

      public CommandOff(Tv tv) {
       myTv = tv;
      }

      public void execute() {
       myTv.turnOff();
      }
    }

    //頻道切換命令
    public class CommandChange implements Command {
      private Tv myTv;

      private int channel;

      public CommandChange(Tv tv, int channel) {
       myTv = tv;
       this.channel = channel;
      }

      public void execute() {
       myTv.changeChannel(channel);
      }
    }

    //可以看作是遙控器吧
    public class Control {
      private Command onCommand, offCommand, changeChannel;

      public Control(Command on, Command off, Command channel) {
       onCommand = on;
       offCommand = off;
       changeChannel = channel;
      }

      public void turnOn() {
       onCommand.execute();
      }

      public void turnOff() {
       offCommand.execute();
      }

      public void changeChannel() {
       changeChannel.execute();
      }
    }

    //測試類
    public class Client {
      public static void main(String[] args) {
       // 命令接收者
       Tv myTv = new Tv();
       // 開機命令
       CommandOn on = new CommandOn(myTv);
       // 關機命令
       CommandOff off = new CommandOff(myTv);
       // 頻道切換命令
       CommandChange channel = new CommandChange(myTv, 2);
       // 命令控制對象
       Control control = new Control(on, off, channel);

       // 開機
       control.turnOn();
       // 切換頻道
       control.changeChannel();
       // 關機
       control.turnOff();
      }
    }


    執行結果為:
    The televisino is on.
    Now TV channel is 2
    The television is off.
    復制代碼
    復制代碼

    4.應用場景

    在下面的情況下應當考慮使用命令模式:

    1)使用命令模式作為"CallBack"在面向對象系統中的替代。"CallBack"講的便是先將一個函數登記上,然后在以后調用此函數。

    2)需要在不同的時間指定請求、將請求排隊。一個命令對象和原先的請求發出者可以有不同的生命期。換言之,原先的請求發出者可能已經不在了,而命令對象本身仍然是活動的。這時命令的接收者可以是在本地,也可以在網絡的另外一個地址。命令對象可以在串形化之后傳送到另外一臺機器上去。

    3)系統需要支持命令的撤消(undo)。命令對象可以把狀態存儲起來,等到客戶端需要撤銷命令所產生的效果時,可以調用undo()方法,把命令所產生的效果撤銷掉。命令對象還可以提供redo()方法,以供客戶端在需要時,再重新實施命令效果。

    4)如果一個系統要將系統中所有的數據更新到日志里,以便在系統崩潰時,可以根據日志里讀回所有的數據更新命令,重新調用Execute()方法一條一條執行這些命令,從而恢復系統在崩潰前所做的數據更新。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 丰满爆乳一区二区三区| 久久综合97丁香色香蕉| 日韩亚洲AV人人夜夜澡人人爽| 四虎成人精品无码| 国产精品中文字幕观看| 国产永久免费高清在线观看 | 欧美 日韩 亚洲 精品二区| 丰满少妇被猛烈进出69影院| 亚洲欧美日韩在线码| 性动态图AV无码专区| 亚欧乱色熟女一区二区三区| 2021国产精品视频网站| 宅男噜噜噜66网站高清| 亚洲AV中文无码乱人伦在线咪咕| 中文字幕精品人妻丝袜| 又黄又无遮挡AAAAA毛片| 亚洲乱色熟女一区二区三区麻豆| 人妻系列无码专区免费| 亚洲AV无码成H人动漫无遮挡| 国产仑乱无码内谢| 亚洲国产成人精品福利无码| 精品无码人妻一区二区三区品| 少妇办公室好紧好爽再浪一点| 好大好深好猛好爽视频免费| 国内精品自线在拍| 国产成人精彩在线视频| 美女黄18以下禁止观看| 天堂mv在线mv免费mv香蕉| 国产精品丝袜亚洲熟女| 乱公和我做爽死我视频| 中文字幕日韩国产精品| 国产又黄又湿又刺激网站| 女人被黑人躁得好爽视频| 又大又长粗又爽又黄少妇视频| 麻豆一区二区中文字幕| 精精国产XXX在线观看| 又大又粗又爽A级毛片免费看| 欧洲一区二区中文字幕| 亚洲欧美中文日韩V日本| 欧美乱码伦视频免费| 国产在线不卡精品网站|