1. 程式人生 > >設計模式-行為型模式-命令模式

設計模式-行為型模式-命令模式

設計模式-行為型模式-命令模式

基礎

以一個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();
    }
}

總結

將需求封裝成命令,然後再負責人當中封裝,最後,需要的時候,直接呼叫負責人,將命令傳入進去即可。