设计模式笔记之十四 (命令模式)
命令模式
命令模式是一種比較容易理解的設計模式,顧名思義,就是調用者發一個命令,有人給做完就行了,無關乎怎么做,也無關乎誰做。
我們繼續我們以往的方式:理論聯系實踐的方式來理解命令模式。
?
最近我們實驗室接到了一個新的訂單,由于我們太陽獸人工廠的強大市場公關能力,我國某富豪需求一批太陽女獸人來滿足其某些需求。
老總非常高興得到這么大的一筆訂單,所以大筆一揮,決定做,并且取代號為‘愛’。
俗話說得好,領導一動嘴,小弟弟跑斷腿。老總只發號了一個做的命令,并不關心是誰做的,怎么做的,只關心最后能不能做好。
class MiShu {public void doLove() {} }public class Command {public static void main(String[] args) {//老總對秘書說把愛給做出來MiShu mishu = new MiShu();mishu.doLove();} }
都說秘書是老板的小棉襖,秘書知道要將老板的命令交給一個信任的人去做,并且那個人還必須要能做,最直接的做法是,秘書直接通知獸人工廠來生產’愛‘
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;}@Overridepublic 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;}@Overridepublic void exec() {f.make();}}class HateMingLing implements MingLing{private ShouRenFactory f;public HateMingLing(ShouRenFactory f) {this.f = f;}@Overridepublic 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;}@Overridepublic void exec() {f.make();}}class HateMingLing implements MingLing{private Factory f;public HateMingLing(Factory f) {this.f = f;}@Overridepublic void exec() {f.hate();}}public class Command {public static void main(String[] args) {//老總對秘書說把愛給做出來MiShu mishu = new MiShu();mishu.doLove();mishu.doHate();} }
到這里我們就能看出命令模式的好處:
他能將命令發布者和命令執行者進行解偶。所以我們能夠很容易擴展更多的執行者,擴展更多的命令。
?
?
PS:好久沒有更新了,原因么,搞軟件的大家應該都能猜到。 新開工程和交付工程總是要加班的。 希望大家一如既往的喜歡這個風格的設計模式。在枯燥的碼海中找到一點歡樂,找到一點知識。
這段時間也反思了不少,覺得講得不夠清楚。本想再加一些UML圖和一些概念的講解。但是那些滿地圖都是,這個系列的博客本意只是將我對設計模式的理解用另類的方法記錄下來,以便自己回憶。便又作罷,只是如此,搏一笑而已。
轉載于:https://www.cnblogs.com/biglaojiang/p/3096954.html
總結
以上是生活随笔為你收集整理的设计模式笔记之十四 (命令模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄山风景区卖票时间
- 下一篇: CSS——float属性备忘笔记