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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

設(shè)計(jì)模式-命令模式

2019-11-10 17:29:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.命令模式的定義及使用場(chǎng)景

定義:

命令模式是行為型設(shè)計(jì)模式之一。將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而讓用戶使用不同的請(qǐng)求把客戶端參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以支持可撤銷(xiāo)的操作

使用場(chǎng)景:

需要抽象出待執(zhí)行的動(dòng)作,然后以參數(shù)的形式提供出來(lái),類似于過(guò)程設(shè)計(jì)中的回調(diào)機(jī)制,而命令模式正是回調(diào)機(jī)制的一個(gè)面向?qū)ο蟮奶娲贰T诓煌臅r(shí)刻指定、排列和執(zhí)行請(qǐng)求。一個(gè)命令對(duì)象可以有與初始請(qǐng)求無(wú)關(guān)的生存期。需要支持取消操作。支持修改日志功能,這樣當(dāng)系統(tǒng)奔潰時(shí),這些修改可以被重做一遍。

需要支持事務(wù)操作。

2. 命令模式的優(yōu)缺點(diǎn)

2.1優(yōu)點(diǎn)

1)類間解耦調(diào)用者角色與接受者角色之間沒(méi)有任何依賴關(guān)系,調(diào)用者實(shí)現(xiàn)功能時(shí)只需要調(diào)用Command抽象類的execute方法就可以,不需要了解到底是那個(gè)接受者執(zhí)行2)可擴(kuò)展性Command的子類可以非常容易地?cái)U(kuò)展,而調(diào)用者Invoker和高層次的模塊Client不產(chǎn)生嚴(yán)重的代碼耦合3)命令模式結(jié)合其他模式會(huì)更優(yōu)秀命令模式可以結(jié)合責(zé)任鏈模式,實(shí)現(xiàn)命令族解析任務(wù);結(jié)合模板方法模式,則可以減少Command子類的膨脹問(wèn)題

2.2缺點(diǎn)

命令模式也是有缺點(diǎn)的,請(qǐng)看Command的子類;如果有N個(gè)命令,問(wèn)題就出來(lái)了,Command的子類就可不是幾個(gè),而是N個(gè),這個(gè)類膨脹得非常大,這個(gè)就需要讀者在項(xiàng)目中慎重考慮

3.注意事項(xiàng)

對(duì)于命令模式,大家可能 心存疑慮,明明是一個(gè)很簡(jiǎn)單的調(diào)用邏輯,為什么要做如此的復(fù)雜,為什么不直接reciver的excute方法就可以實(shí)現(xiàn)功能?調(diào)用邏輯復(fù)雜,是為了如果后續(xù)命令的增加, 能夠應(yīng)對(duì)后續(xù)需求的變化。簡(jiǎn)單的只是開(kāi)發(fā)起來(lái)方便,但對(duì)后續(xù)的維護(hù)則是困難。除此之外,使用命令模式的另一個(gè)好處是可以實(shí)現(xiàn)命令記錄的功能,可以在調(diào)用者里面使用一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)執(zhí)行過(guò)的命令對(duì)象,以此可以方便地知道剛剛執(zhí)行過(guò)哪些命令,并可以在需要是恢復(fù)。并且可以在調(diào)用者中執(zhí)行日志的記錄。

4. 命令模式的實(shí)現(xiàn)方式

public abstract class Command {    //執(zhí)行具體操作命令    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();    }}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 教育| 黄平县| 临湘市| 鄂伦春自治旗| 保山市| 河北区| 电白县| 永和县| 贵定县| 马关县| 驻马店市| 晋江市| 顺昌县| 阳信县| 天门市| 台山市| 峡江县| 松原市| 高台县| 麻城市| 福海县| 汕尾市| 平乡县| 万安县| 肇源县| 桐柏县| 凤翔县| 东莞市| 湛江市| 调兵山市| 孟州市| 慈利县| 石首市| 富蕴县| 伊川县| 武穴市| 巨野县| 永定县| 阳城县| 应用必备| 万年县|