做者:小傅哥
博客:https://bugstack.cn - 原創系列專題文章
html
沉澱、分享、成長,讓本身和他人都能有所收穫!😄
鍥而不捨的重要性
java
初學編程每每都很懵,幾乎在學習的過程當中會遇到各類各樣的問題,哪怕別人那運行好好的代碼,但你照着寫完就報錯。但好在你堅持住了,不然你可能看不到這篇文章。時間和成長就是相互關聯着,你在哪條路上堅持走的久,就能看見那條的終點有多美,但若是你浪費了一次又一次努力的機會,那麼你也會一樣錯過不少機遇,由於你的路換了。堅持學習、努力成長,持以恆的付出必定會有所收穫。編程
學習方法的重要性
設計模式
不會學習每每會耽誤不少時間,又沒有可觀的收成。但不會學習有時候是由於懶形成的,尤爲是學習視頻、書籍資料、技術文檔等,若是隻是看了卻不是實際操做驗證,那麼真的很難把別人的知識讓本身吸取,即便是當時感受會了也很快就會忘記。時而也常常會有人找到你說;「這個我不知道,你先告訴我,事後我就學。」但事後你學了嗎?微信
你願意爲一個知識盲區付出多長時間
框架
你內心時而會蹦出這樣的詞嗎;太難了我不會
、找我的幫一下吧
、放棄了放棄了
,其實誰均可能遇到很很差解決的問題,也是能夠去問去諮詢的。但,若是在這以前你沒有在本身的大腦中反覆的尋找答案,那麼你的大腦中就不會造成一個凸點的知識樹,缺乏了這個學習過程也就缺乏了查閱各類資料給本身大腦填充知識的機會,哪怕是問到了答案最終也會因時間流逝而忘記。函數
bugstack蟲洞棧
,回覆源碼下載
獲取(打開獲取的連接,找到序號18)工程 | 描述 |
---|---|
itstack-demo-design-14-01 | 使用一坨代碼實現業務需求 |
itstack-demo-design-14-02 | 經過設計模式優化代碼結構,增長擴展性和維護性 |
命令模式在咱們一般的互聯網開發中相對來講用的比較少,但這樣的模式在咱們的平常中卻常用到,那就是Ctrl+C
、Ctrl+V
。固然若是你開發過一些桌面應用,也會感覺到這樣設計模式的應用場景。從這樣的模式感覺上,能夠想到這是把邏輯實現與操做請求進行分離,下降耦合方便擴展。學習
命令模式是行爲模式中的一種,以數據驅動的方式將命令對象
,可使用構造函數的方式傳遞給調用者。調用者再提供相應的實現爲命令執行提供操做方法。可能會感受這部分有一些饒,能夠經過對代碼的實現進行理解,在經過實操來熟練。測試
在這個設計模式的實現過程當中有以下幾個比較重要的點;優化
在這個案例中咱們模擬在餐廳中點餐交給廚師👨🍳烹飪的場景
命令場景的核心的邏輯是調用方與不須要去關心具體的邏輯實現,在這個場景中也就是點餐人員只須要把須要點的各類菜系交個小二
就能夠,小二再把各項菜品交給各個廚師進行烹飪。也就是點餐人員不須要跟各個廚師交流,只須要在統一的環境裏下達命令就能夠。
在這個場景中能夠看到有不一樣的菜品;山東(魯菜)、四川(川菜)、江蘇(蘇菜)、廣東(粵菜)、福建(閩菜)、浙江(浙菜)、湖南(湘菜),每種菜品都會有不一樣的廚師👩🍳進行烹飪。而客戶並不會去關心具體是誰烹飪,廚師也不會去關心誰點的餐。客戶只關心早點上菜,廚師只關心還有多少個菜要作。而這中間的銜接的過程,由小二完成。
那麼在這樣的一個模擬場景下,能夠先思考🤔哪部分是命令模式的拆解,哪部分是命令的調用者以及命令的實現邏輯。
不考慮設計模式的狀況下,在作這樣一個點單系統,有一個類就夠了
像是這樣一個複雜的場景,若是不知道設計模式直接開發,也是能夠達到目的的。但對於後續的各項的菜品擴展、廚師實現以及如何調用上會變得很是耦合難以擴展。
itstack-demo-design-14-01 └── src └── main └── java └── org.itstack.demo.design └── XiaoEr.java
public class XiaoEr { private Logger logger = LoggerFactory.getLogger(XiaoEr.class); private Map<Integer, String> cuisineMap = new ConcurrentHashMap<Integer, String>(); public void order(int cuisine) { // 廣東(粵菜) if (1 == cuisine) { cuisineMap.put(1, "廣東廚師,烹飪魯菜,宮廷最大菜系,以孔府風味爲龍頭"); } // 江蘇(蘇菜) if (2 == cuisine) { cuisineMap.put(2, "江蘇廚師,烹飪蘇菜,宮廷第二大菜系,古今國宴上最受人歡迎的菜系。"); } // 山東(魯菜) if (3 == cuisine) { cuisineMap.put(3, "山東廚師,烹飪魯菜,宮廷最大菜系,以孔府風味爲龍頭."); } // 四川(川菜) if (4 == cuisine) { cuisineMap.put(4, "四川廚師,烹飪川菜,中國最有特點的菜系,也是民間最大菜系。"); } } public void placeOrder() { logger.info("菜單:{}", JSON.toJSONString(cuisineMap)); } }
order()
,另一個方法展現菜品的信息placeOrder()
。接下來使用命令模式來進行代碼優化,也算是一次很小的重構。
命令模式能夠將上述的模式拆解三層大塊,命令、命令實現者、命令的調用者,當有新的菜品或者廚師擴充時候就能夠在指定的類結構下進行實現添加便可,外部的調用也會很是的容易擴展。
itstack-demo-design-14-02 └── src ├── main │ └── java │ └── org.itstack.demo.design │ ├── cook │ │ ├── impl │ │ │ ├── GuangDongCook.java │ │ │ ├── JiangSuCook.java │ │ │ ├── ShanDongCook.java │ │ │ └── SiChuanCook.java │ │ └── ICook.java │ ├── cuisine │ │ ├── impl │ │ │ ├── GuangDoneCuisine.java │ │ │ ├── JiangSuCuisine.java │ │ │ ├── ShanDongCuisine.java │ │ │ └── SiChuanCuisine.java │ │ └── ICuisine.java │ └── XiaoEr.java └── test └── java └── org.itstack.demo.test └── ApiTest.java
命令模式模型結構
/** * 博客:https://bugstack.cn - 沉澱、分享、成長,讓本身和他人都能有所收穫! * 公衆號:bugstack蟲洞棧 * Create by 小傅哥(fustack) @2020 * * 菜系 * 0一、山東(魯菜)——宮廷最大菜系,以孔府風味爲龍頭。 * 0二、四川(川菜)——中國最有特點的菜系,也是民間最大菜系。 * 0三、江蘇(蘇菜)——宮廷第二大菜系,古今國宴上最受人歡迎的菜系。 * 0四、廣東(粵菜)——國內民間第二大菜系,國外最有影響力的中國菜系,能夠表明中國。 * 0五、福建(閩菜)——客家菜的表明菜系。 * 0六、浙江(浙菜)——中國最古老的菜系之一,宮廷第三大菜系。 * 0七、湖南(湘菜)——民間第三大菜系。 * 0八、安徽(徽菜)——徽州文化的典型表明。 */ public interface ICuisine { void cook(); // 烹調、製做 }
廣東(粵菜)
public class GuangDoneCuisine implements ICuisine { private ICook cook; public GuangDoneCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
江蘇(蘇菜)
public class JiangSuCuisine implements ICuisine { private ICook cook; public JiangSuCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
山東(魯菜)
public class ShanDongCuisine implements ICuisine { private ICook cook; public ShanDongCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
四川(川菜)
public class SiChuanCuisine implements ICuisine { private ICook cook; public SiChuanCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
ICook
),並經過這個類提供的方法進行操做命令(烹飪菜品)cook.doCooking()
。public interface ICook { void doCooking(); }
粵菜,廚師
public class GuangDongCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("廣東廚師,烹飪魯菜,宮廷最大菜系,以孔府風味爲龍頭"); } }
蘇菜,廚師
public class JiangSuCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("江蘇廚師,烹飪蘇菜,宮廷第二大菜系,古今國宴上最受人歡迎的菜系。"); } }
魯菜,廚師
public class ShanDongCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("山東廚師,烹飪魯菜,宮廷最大菜系,以孔府風味爲龍頭"); } }
蘇菜,廚師
public class SiChuanCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("四川廚師,烹飪川菜,中國最有特點的菜系,也是民間最大菜系。"); } }
public class XiaoEr { private Logger logger = LoggerFactory.getLogger(XiaoEr.class); private List<ICuisine> cuisineList = new ArrayList<ICuisine>(); public void order(ICuisine cuisine) { cuisineList.add(cuisine); } public synchronized void placeOrder() { for (ICuisine cuisine : cuisineList) { cuisine.cook(); } cuisineList.clear(); } }
@Test public void test(){ // 菜系 + 廚師;廣東(粵菜)、江蘇(蘇菜)、山東(魯菜)、四川(川菜) ICuisine guangDoneCuisine = new GuangDoneCuisine(new GuangDongCook()); JiangSuCuisine jiangSuCuisine = new JiangSuCuisine(new JiangSuCook()); ShanDongCuisine shanDongCuisine = new ShanDongCuisine(new ShanDongCook()); SiChuanCuisine siChuanCuisine = new SiChuanCuisine(new SiChuanCook()); // 點單 XiaoEr xiaoEr = new XiaoEr(); xiaoEr.order(guangDoneCuisine); xiaoEr.order(jiangSuCuisine); xiaoEr.order(shanDongCuisine); xiaoEr.order(siChuanCuisine); // 下單 xiaoEr.placeOrder(); }
菜品
與廚師
的組合;new GuangDoneCuisine(new GuangDongCook());
,每個具體的命令都擁有一個對應的實現類,能夠進行組合。xiaoEr.order(guangDoneCuisine);
,這裏分別添加了四種菜品,給小二。22:12:13.056 [main] INFO org.itstack.demo.design.cook.ICook - 廣東廚師,烹飪魯菜,宮廷最大菜系,以孔府風味爲龍頭 22:12:13.059 [main] INFO org.itstack.demo.design.cook.ICook - 江蘇廚師,烹飪蘇菜,宮廷第二大菜系,古今國宴上最受人歡迎的菜系。 22:12:13.059 [main] INFO org.itstack.demo.design.cook.ICook - 山東廚師,烹飪魯菜,宮廷最大菜系,以孔府風味爲龍頭 22:12:13.059 [main] INFO org.itstack.demo.design.cook.ICook - 四川廚師,烹飪川菜,中國最有特點的菜系,也是民間最大菜系。 Process finished with exit code 0
命令
、實現
、調用者
,而這三塊內容的拆分也是選擇適合場景的關鍵因素,通過這樣的拆分可讓邏輯具有單一職責的性質,便於擴展。