設計模式筆記之十四 (命令模式)

命令模式設計模式

命令模式是一種比較容易理解的設計模式,顧名思義,就是調用者發一個命令,有人給作完就好了,無關乎怎麼作,也無關乎誰作。ide

咱們繼續咱們以往的方式:理論聯繫實踐的方式來理解命令模式。this

 

最近咱們實驗室接到了一個新的訂單,因爲咱們太陽獸人工廠的強大市場公關能力,我國某富豪需求一批太陽女獸人來知足其某些需求。spa

老總很是高興獲得這麼大的一筆訂單,因此大筆一揮,決定作,而且取代號爲‘愛’。設計

俗話說得好,領導一動嘴,小弟弟跑斷腿。老總只發號了一個作的命令,並不關心是誰作的,怎麼作的,只關心最後能不能作好。code

class MiShu {
    public void doLove() {
        
    }
}

public class Command {
    public static void main(String[] args) {
        //老總對祕書說把愛給作出來
        MiShu mishu = new MiShu();
        mishu.doLove();
    }
}

都說祕書是老闆的小棉襖,祕書知道要將老闆的命令交給一個信任的人去作,而且那我的還必需要能作,最直接的作法是,祕書直接通知獸人工廠來生產’愛‘blog

class MiShu {
    public void doLove() {
        new ShouRenFactory().make();
    }
}
class ShouRenFactory {
    public void make() {
        System.out.println("造一個愛,和蒼老師");
        System.out.println("再造一個愛,和波多野小姐");
    }
}

可是這樣也有一個問題,像咱們實驗室這種高刺激性地方,換廠長是很日常的事情,若是獸人工廠換我的來當廠長,而且作事風格變了,祕書就得來適應獸人工廠新廠長的作事風格接口

class MiShu {
    public void doLove() {
        //new ShouRenFactory().make();
        new ShouRenFactory().makeNew();// 這裏祕書須要適應ShouRenFactory的新接口makeNew接口就得改代碼
    }
}
class ShouRenFactory {
    public void makeNew() {
        System.out.println("造一個愛,和蒼老師");
        System.out.println("再造一個愛,和波多野小姐");
    }
}

這怎麼能行,祕書是老總的小棉襖又不是獸人工廠的小棉襖,只有你適應個人,哪有小棉襖適應你的,因此祕書想出一個方法:博客

我給大家這些個工廠一個模板,大家根據大家本身的能力填寫這個模板,那我之後只要挑選模板就好了。模板

class MiShu {
    public void doLove() {
        ShouRenFactory factory = new ShouRenFactory();//指定執行者
        LoveMingLing love = new LoveMingLing(factory);//指定命令模板
        love.exec();//做吧
    }
}

class ShouRenFactory {
    public void make() {
        System.out.println("造一個愛,和蒼老師");
        System.out.println("再造一個愛,和波多野小姐");
    }
}

interface MingLing {
    public void exec();
}

class LoveMingLing implements MingLing{
    
    private ShouRenFactory f;
    
    public LoveMingLing(ShouRenFactory f) {
        this.f = f;
    }
    
    @Override
    public void exec() {
        f.make();
    }
    
}
public class Command {
    public static void main(String[] args) {
        //老總對祕書說把愛給作出來
        MiShu mishu = new MiShu();
        mishu.doLove();
    }
}

如今就比較好了,若是之後又有新的廠長,咱們大不了換我的就好了,或者更新下命令模板。固然最方便的是:

若是除了愛命令又有新的命令,好比恨命令, 只要新加一個恨命令模板就行了。

class MiShu {
    public void doLove() {
        ShouRenFactory factory = new ShouRenFactory();//指定執行者
        LoveMingLing love = new LoveMingLing(factory);//指定命令模板
        love.exec();//做吧
    }
    
    public void doHate() {
        ShouRenFactory factory = new ShouRenFactory();//指定執行者
        HateMingLing hate = new HateMingLing(factory);//指定命令模板
        hate.exec();//做吧
    }
}

class ShouRenFactory {
    public void make() {
        System.out.println("造一個愛,和蒼老師");
        System.out.println("再造一個愛,和波多野小姐");
    }

    public void hate() {
        System.out.println("造一個恨,和羅玉風");
        System.out.println("再造一個恨,和校長");
    }
}

interface MingLing {
    public void exec();
}

class LoveMingLing implements MingLing{
    
    private ShouRenFactory f;
    
    public LoveMingLing(ShouRenFactory f) {
        this.f = f;
    }
    
    @Override
    public void exec() {
        f.make();
    }
    
}

class HateMingLing implements MingLing{
    
    private ShouRenFactory f;
    
    public HateMingLing(ShouRenFactory f) {
        this.f = f;
    }
    
    @Override
    public void exec() {
        f.hate();
    }
    
}

public class Command {
    public static void main(String[] args) {
        //老總對祕書說把愛給作出來
        MiShu mishu = new MiShu();
        mishu.doLove();
        mishu.doHate();
    }
}

固然,當獸人工廠不行的時候,咱們還能夠很簡單的更換接收者,反正是咱們的造人工廠就行

class MiShu {
    public void doLove() {
        Factory factory = new ShouRenFactory();//指定執行者
        LoveMingLing love = new LoveMingLing(factory);//指定命令模板
        love.exec();//做吧
    }
    
    public void doHate() {
        Factory factory = new RenYaoFactory();//指定執行者
        HateMingLing hate = new HateMingLing(factory);//指定命令模板
        hate.exec();//做吧
    }
}

interface Factory {
    public void make();
    public void hate();
}

class ShouRenFactory implements Factory{
    public void make() {
        System.out.println("造一個愛,和蒼老師");
        System.out.println("再造一個愛,和波多野小姐");
    }

    public void hate() {
        System.out.println("造一個恨,和羅玉風");
        System.out.println("再造一個恨,和校長");
    }
}
class RenYaoFactory implements Factory{
    public void make() {
        System.out.println("造一個愛,和人妖");
    }

    public void hate() {
        System.out.println("造一個恨,和醜一點的人妖");
    }
}
interface MingLing {
    public void exec();
}

class LoveMingLing implements MingLing{
    
    private Factory f;
    
    public LoveMingLing(Factory f) {
        this.f = f;
    }
    
    @Override
    public void exec() {
        f.make();
    }
    
}

class HateMingLing implements MingLing{
    
    private Factory f;
    
    public HateMingLing(Factory f) {
        this.f = f;
    }
    
    @Override
    public void exec() {
        f.hate();
    }
    
}

public class Command {
    public static void main(String[] args) {
        //老總對祕書說把愛給作出來
        MiShu mishu = new MiShu();
        mishu.doLove();
        mishu.doHate();
    }
}

到這裏咱們就能看出命令模式的好處:

他能將命令發佈者和命令執行者進行解偶。因此咱們可以很容易擴展更多的執行者,擴展更多的命令。

 

 

PS:很久沒有更新了,緣由麼,搞軟件的你們應該都能猜到。 新開工程和交付工程老是要加班的。 但願你們一如既往的喜歡這個風格的設計模式。在枯燥的碼海中找到一點歡樂,找到一點知識。

這段時間也反思了很多,以爲講得不夠清楚。本想再加一些UML圖和一些概念的講解。可是那些滿地圖都是,這個系列的博客本意只是將我對設計模式的理解用另類的方法記錄下來,以便本身回憶。便又做罷,只是如此,搏一笑而已。

相關文章
相關標籤/搜索