国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

設計模式-命令模式

2019-11-10 20:02:42
字體:
來源:轉載
供稿:網友

1.命令模式的定義及使用場景

定義:

命令模式是行為型設計模式之一。將一個請求封裝成一個對象,從而讓用戶使用不同的請求把客戶端參數化;對請求排隊或者記錄請求日志,以支持可撤銷的操作

使用場景:

需要抽象出待執行的動作,然后以參數的形式提供出來,類似于過程設計中的回調機制,而命令模式正是回調機制的一個面向對象的替代品。在不同的時刻指定、排列和執行請求。一個命令對象可以有與初始請求無關的生存期。需要支持取消操作。支持修改日志功能,這樣當系統奔潰時,這些修改可以被重做一遍。

需要支持事務操作。

2. 命令模式的優缺點

2.1優點

1)類間解耦調用者角色與接受者角色之間沒有任何依賴關系,調用者實現功能時只需要調用Command抽象類的execute方法就可以,不需要了解到底是那個接受者執行2)可擴展性Command的子類可以非常容易地擴展,而調用者Invoker和高層次的模塊Client不產生嚴重的代碼耦合3)命令模式結合其他模式會更優秀命令模式可以結合責任鏈模式,實現命令族解析任務;結合模板方法模式,則可以減少Command子類的膨脹問題

2.2缺點

命令模式也是有缺點的,請看Command的子類;如果有N個命令,問題就出來了,Command的子類就可不是幾個,而是N個,這個類膨脹得非常大,這個就需要讀者在項目中慎重考慮

3.注意事項

對于命令模式,大家可能 心存疑慮,明明是一個很簡單的調用邏輯,為什么要做如此的復雜,為什么不直接reciver的excute方法就可以實現功能?調用邏輯復雜,是為了如果后續命令的增加, 能夠應對后續需求的變化。簡單的只是開發起來方便,但對后續的維護則是困難。除此之外,使用命令模式的另一個好處是可以實現命令記錄的功能,可以在調用者里面使用一個數據結構來存儲執行過的命令對象,以此可以方便地知道剛剛執行過哪些命令,并可以在需要是恢復。并且可以在調用者中執行日志的記錄。

4. 命令模式的實現方式

public abstract class Command {    //執行具體操作命令    public  abstract void execute();}
public class ConcreteCommand1 extends Command {    PRivate  Receiver receiver;    public ConcreteCommand1() {        this.receiver = new ConcreteReceiver1();    }    public void setReceiver(Receiver receiver) {        this.receiver = receiver;    }    @Override    public void execute() {        if(receiver!=null){            receiver.doSomething();        }    }}
public class ConcreteCommand2 extends Command {    private  Receiver receiver;    public ConcreteCommand2() {        this.receiver = new ConcreteReceiver2();    }    public void setReceiver(Receiver receiver) {        this.receiver = receiver;    }    @Override    public void execute() {        if(receiver!=null){            receiver.doSomething();        }    }}
public abstract  class Receiver {    public abstract void doSomething();}
public class ConcreteReceiver1 extends Receiver {    @Override    public void doSomething() {        System.out.println("ConcreteReceiver1 do...");    }}
public class ConcreteReceiver2 extends Receiver {    @Override    public void doSomething() {        System.out.println("ConcreteReceiver2 do...");    }}
public class Invoker {    private Command command;    public void setCommand(Command command) {        this.command = command;    }    public void action() {        this.command.execute();    }}
public class Test {    public static void main(String args[]) {        Invoker invoker = new Invoker();        Receiver receiver = new ConcreteReceiver1();        Command command = new ConcreteCommand1();        invoker.setCommand(command);        invoker.action();        Receiver receiver2 = new ConcreteReceiver2();        Command command2 = new ConcreteCommand2();        invoker.setCommand(command2);        invoker.action();    }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 民丰县| 苏尼特左旗| 孝义市| 沂源县| 新宾| 习水县| 营山县| 新泰市| 登封市| 兰坪| 无锡市| 蕉岭县| 三原县| 固阳县| 天津市| 建阳市| 蒙阴县| 玉田县| 巧家县| 恩施市| 临颍县| 从化市| 昔阳县| 台江县| 石楼县| 淮安市| 聂拉木县| 阳谷县| 威海市| 微山县| 上虞市| 双峰县| 翼城县| 金门县| 灵台县| 万盛区| 睢宁县| 正阳县| 上林县| 宁河县| 高雄县|