14、COMMAND(命令模式)

目的

將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使你可使用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄日志,以及支持可撤銷(xiāo)的操作。

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

  1. 降低系統(tǒng)的耦合度。命令模式能將調(diào)用操作的對(duì)象與實(shí)現(xiàn)該操作的對(duì)象解耦。
  2. 增加或刪除命令非常方便。采用命令模式增加與刪除命令不會(huì)影響其他類(lèi),他滿(mǎn)足“開(kāi)閉原則”,比擴(kuò)展比較靈活。
  3. 可以實(shí)現(xiàn)宏命令。民工模式可以與組合模式結(jié)合,將多個(gè)命令裝配成一個(gè)組合命令,即宏命令。
  4. 方便實(shí)現(xiàn)Undo和Redo操作。命令模式可以與備忘錄模式結(jié)合,實(shí)現(xiàn)命令的撤銷(xiāo)與恢復(fù)。

使用例子

在高中的時(shí)候,小陳在暑假的時(shí)候太無(wú)聊了就去酒店做兼職。在這個(gè)情況下,于是,他就使用命令模式來(lái)點(diǎn)菜。
餐廳里面一共有兩名廚師,這是屬于類(lèi)圖里面的ConcreteReceiver,分別是中餐廚師和西餐廚師。一共由兩種菜,分別是紅燒肉和沙拉,這相當(dāng)于類(lèi)圖中的ConcreteCommand。

命令由調(diào)用cooking()函數(shù)來(lái)讓廚師做菜。
詳細(xì)代碼如下:

package command;

/**
 * 廚師接口,相當(dāng)于抽象的
 */
public interface Chief {
    void cooking(String name);
}


package command;

/**
 * 中國(guó)廚師
 */
public class ChineseChief implements Chief {
    @Override
    public void cooking(String name){
        System.out.println("中餐廚師開(kāi)始做" + name);
    }
}


package command;

/**
 * 西餐廚師
 */
public class WesternChief implements Chief {
    public void cooking(String name){
        System.out.println("西餐廚師開(kāi)始制作"+ name);
    }
}


package command;
/**
 * 食物接口
 */
public interface Food {
    void cooking();
}

package command;

/**
 * 紅燒肉,相當(dāng)于具體命令
 */
public class BraisedPork implements Food{
    private Chief chief;
    public BraisedPork(Chief chief){
        this.chief = chief;
    }
    public void cooking(){
        chief.cooking("紅燒肉");
    }
}

package command;

public class Salad implements Food {
    private Chief chief;
    public Salad(Chief chief){
        this.chief = chief;
    }
    public void cooking(){
        chief.cooking("沙拉");
    }
}


package command;

/**
 * 在本類(lèi)中使用建造者模式來(lái)設(shè)定多個(gè)菜品
 */
public class Server {
    String name;
    Food food1,food2,food3;
    private Server(Builder builder){
        this.name = builder.name;
        this.food1 = builder.food1;
        this.food2 = builder.food2;
        this.food3 = builder.food3;
    }

    /**
     * 服務(wù)員將菜單傳遞給廚師,他是命令的調(diào)用者
     */
    public void deliver(){
        if (food1 != null){
            food1.cooking();
        }
        if(food2 != null){
            food2.cooking();
        }
        if(food3 != null){
            food3.cooking();
        }
    }

    public static class Builder{
        String name;
        private Food food1;
        private Food food2;
        private Food food3;
        public Builder(String name){
            this.name = name;
        }
        public Builder food1(Food food){
            this.food1 = food;
            return this;
        }
        public Builder food2(Food food){
            this.food2 = food;
            return this;
        }
        public Builder food3(Food food){
            this.food3 = food;
            return this;
        }
        public Server builder(){
            return new Server(this);
        }
    }
}

package command;

public class Client {
    public static void main(String[] args) {
        Chief chineseChief = new ChineseChief();
        Chief westernChief = new WesternChief();

        Food braisePork = new BraisedPork(chineseChief);
        Food salad = new Salad(westernChief);
        Server server = new Server.Builder("小陳").food1(braisePork).food2(salad).builder();
        server.deliver();
    }
}

輸出結(jié)果如下:

中餐廚師開(kāi)始做紅燒肉
西餐廚師開(kāi)始制作沙拉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★★☆】直接出處:命令模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 927評(píng)論 0 3
  • 3.5 隊(duì)列請(qǐng)求## 所謂隊(duì)列請(qǐng)求,就是對(duì)命令對(duì)象進(jìn)行排隊(duì),組成工作隊(duì)列,然后依次取出命令對(duì)象來(lái)執(zhí)行。多用多線程或...
    七寸知架構(gòu)閱讀 2,127評(píng)論 4 53
  • 1.初識(shí)命令模式 將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及...
    王偵閱讀 855評(píng)論 0 2
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,658評(píng)論 1 32
  • 目錄 本文的結(jié)構(gòu)如下: 什么是命令模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 總...
    w1992wishes閱讀 1,238評(píng)論 2 9

友情鏈接更多精彩內(nèi)容