Java設計模式之命令模式
命令模式的概念其實還挺模糊的,雖然不難,但是直接看起來也有點暈,直接看代碼過一遍再去了解概念會好一些。
其實簡單的說命令模式就是將一個"請求"封裝成一個對象,通過這個對象直接就能找到對應的執行命令。
優點:
好處是對於需要重復修改或實現的一些固定的操作,可以很方便的去執行,而不用抽絲剝繭的每次都和細分后的環節打交道,只需要和一個接受者打交道就行了。比如客戶經常需要頻繁的改需求,如果讓客戶每次都和美工組或者程序猿直接溝通,偶爾還好,要是次數多了就會顯得很麻煩,而如果客戶直接把他的想法告訴一個固定的人,這個人接收到客戶的想法后直接就可以調用相應的對象去執行。
缺點:
如果客戶要不斷實現的需求有很多種類,那就得不斷的增加相應的功能實現,就會弄得很麻煩。
先看一張UML圖,了解下每一層的關系
雖然流程圖是從上往下看的,但是實現過程我們得根據現實來,先從底層開始一點點實現
干活前得先把人湊齊了,所以先組建一個項目組
package com.company; //項目組 public abstract class Group { // 規定項目組具備的功能,增刪改查四個功能 abstract void find(); abstract void add(); abstract void delet(); abstract void change(); }
人湊齊了需要進行分工和准備工具,這里分成了需求、美工、和代碼三個組,每個組都實現了項目組里的功能
代碼組
package com.company; public class Code extends Group { @Override void find() { System.out.println("查到代碼組"); } @Override void add() { System.out.println("實現一個代碼功能"); } @Override void delet() { System.out.println("刪除一個代碼功能"); } @Override void change() { System.out.println("修改一個代碼功能"); } }
需求組
package com.company; public class Require extends Group { @Override void find() { System.out.println("查找到需求組"); } @Override void add() { System.out.println("增加一個需求"); } @Override void delet() { System.out.println("刪除一個需求"); } @Override void change() { System.out.println("修改一個需求"); } }
美工組
package com.company; public class Ui extends Group { @Override void find() { System.out.println("查找到美工組"); } @Override void add() { System.out.println("增加一個美工頁面"); } @Override void delet() { System.out.println("刪除一個美工頁面"); } @Override void change() { System.out.println("修改一個美工頁面"); } }
人和工具都有了,現在需要從項目組里選出一個人來和客戶進行對接,客戶有什么想法直接告訴這個人就行了,這樣就不需要去和代碼組或者美工這些人溝通了
package com.company; /*該類是項目組中出的一個項目負責人也就是接收人, 當這個接收人接到了客戶的命令的時候,根據這個命令執行相應的動作*/ public class GroupMan { Conmand conmand; // 得到客戶命令 public void getConmand(Conmand conmand){ this.conmand = conmand; } // 執行方法 public void action(){ conmand.execute(); } }
客戶可以直接把功能命令告訴這個接收人,那么現在需要一個功能命令
package com.company; public abstract class Conmand { //命令中的執行方法,執行的具體實現由項目組中的分組分別去實現 abstract void execute(); }
功能命令需要具體的功能去實現它,比如說增加一個代碼功能或者刪除一個美工圖片
這里先實現一個:"增加代碼功能"的功能命令
package com.company; public class AddCode extends Conmand { Code code = new Code();//該功能由代碼組的人員去實現 @Override void execute() { code.find(); code.add(); } }
其實從這里就可以看出這個命令模式的缺點了,如果客戶后面要增加的功能命令有好多,那么這里就需要實現很多具體的功能,這樣就很繁瑣了
下面就是整個項目動起來的效果了
package com.company; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Main { public static void main(String[] args) { System.out.println("客戶給出一個命令:我需要增加一個代碼功能"); //產生命令 Conmand conmand = new AddCode(); // 叫來項目對接人 GroupMan groupMan = new GroupMan(); //告訴項目對接人命令 groupMan.getConmand(conmand); //項目對接人知道命令后去落實這個命令了:在這背后是這個對接人通知了Group組中的Code組去實現了這個功能 groupMan.action(); } }