設計模式-行為型模式-命令模式
阿新 • • 發佈:2018-12-07
設計模式-行為型模式-命令模式
基礎
以一個MIS系統為栗子
MIS 管理資訊系統(Management Information System,MIS)是一個以人為主導的,利用計算機硬體、軟體和網路裝置,進行資訊的收集、傳遞、儲存、加工、整理的系統,以提高組織的經營效率。
程式碼如下
public abstract class Group{ // 甲乙雙方公開辦公,如果要和某個組討論,要先找到這個組 public abstract void find(); // 要求增加功能 public abstract void add(); // 刪除功能 public abstract void delete(); // 被要求修改功能 public abstract void change(); // 被要求給出變更計劃 public abstract void plan(); }
抽象類中的都是命令方式。
進行需求組
public class RequirementGroup extends Group{ // 客戶要求需求進行更改 public void find(){ } // 客戶要求增加需求 public void add(){ } // 客戶要求修改需求 public void change(){ } // 客戶要求刪除需求 public void delete(){ } // 客戶要求給出變更計劃 public void plan(){ } }
// 美工組
public class PageGroup extends Group{
// 找到美工組
public void find(){
}
// 客戶要求增加頁面
public void add(){
}
// 客戶要求對現有介面修改
public void change(){
}
// 客戶要求刪除頁面
public void delete(){
}
// 給出計劃
public void plan(){
}
}
// 程式碼組 public class CodeGroup extends Group { // 客戶要求過去談 public void find(){ } // 客戶要求增加功能 public void add(){ } // 客戶要求修改功能 public void change(){ } // 客戶要求刪除功能 public void delete(){ } // 客戶要求變更計劃 public void plan(){ } }
最後書寫場景類
// 場景類
public class Client{
public static void main(String[] args){
// 客戶找到需求要求談需求進行修改
Grop rg = new RequirementGroup();
// 找到需求組
rg.find();
// 增加需求組
rg.add();
// 變更計劃
rg.plan();
}
}
此時客戶要求多一個介面
public class Client {
public static void main(String[] args){
Group pg = new PangeGroup();
// 找到需求組
pg.find();
// 刪除需求組
pg.delete();
// 需求變更
pg.plan();
}
}
變更
客戶每次都要單獨找一個,非常複雜,設定一個負責人,負責和客戶和需求,美工之間的連線。
// 抽象出命令類
public abstract class Command{
// 定義三個組,確保子類可以直接使用
protected RequirementGroup rg = new RequirementGroup(); // 需求組
protected PageGroup pg = new PageGroup(); // 美工組
protected CodeGroup cg = new CodeGroup(); // 程式碼組
public abstract void execute(); // 做什麼事情
}
增加需求的命令
public class AddRequirementCommand extends Command{
// 增加一項需求命令
public void execute(){
// 找到需求組
super.rg.find();
// 增加一份需求
super.rg.add();
// 給出計劃
super.rg.plan();
}
}
增加刪除頁面的命令
public class DeletePageCommand extends Command{
public void execute(){
// 找到頁面組
super.pg.find();
// 刪除頁面
super.rg.delete();
// 給出計劃
super.rg.plan();
}
}
最後再將這也命令封裝,成一個負責人
public class invoker {
// 命令
private Command command;
// 客戶發出命令
public void setCommand(Command command){
this.command = command;
}
// 客戶自行命令
public void action(){
this.command.execute();
}
}
最後場景類如下
public class Client{
public static void main(String[] args){
// 定義接頭人
invoker xiaoSan = new Invoker(); // 接頭人
// 客戶增加需求
// 客戶下命令
Command command = new AddRequirementCommand();
// 街頭人收到命令
xiaoSan.setCommand(command);
// 街頭人執行命令
xiaoSan.action();
}
}
繼續更改
由於負責人的抽象類中聲明瞭所有的,所以可以分離
程式碼如下
public abstract class Command {
// 定義子類全域性共享變數
protected final Receiver receiver;
// 實現類名需要接收
public Command(Receiver _receiver){
this.receiver = _receiver;
}
// 每個命令需要有執行
public abstract void execute();
}
然後在Command中宣告接收者。
通過建構函式指定
public class ConcreteCommand1 extends Command{
// 宣告自己預設接收者
public ConcreteCommand1(){
super(new ConcreteReciver1());
}
// 設定新的接受
public ConcreteCommand1(Receiver _receiver){
super(_receiver);
}
// 處理
public void execute(){
super.receiver.doSomething();
}
}
// 宣告場景
public class Client{
public static void main(String[] args){
invoker invoker = new invoker();
// 定義要傳送的命令
Command command = new ConcreteCommand1();
invoker.setCommand(command);
invoker.action();
}
}
總結
將需求封裝成命令,然後再負責人當中封裝,最後,需要的時候,直接呼叫負責人,將命令傳入進去即可。