設計模式之命令模式

簡介

命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行爲型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找可以處理該命令的合適的對象,並把該命令傳給相應的對象,該對象執行命令。命令模式是一個高內聚的模式。

優點:

  1. 類間解耦;
  2. 可擴展性;
  3. 命令模式結合其他模式會更優秀

缺點:
使用命令模式可能會導致某些系統有過多的具體命令類。

類圖

在該類圖中,主要與三個角色:

  • Receice接收者對象:該角色就是幹活的角色,命令應該是在這裏執行;
  • Command命令角色:需要執行的所有命令在該類中聲明;
  • Invoker調用者角色:接收到命令,並執行命令。

例如:在軟件開發公司,都是會分不同的組,有不同的組長,然後又項目經理管理、下達命令。直接上類圖:

Java代碼實現

首先創建一個抽象的組類

public abstract class Group {
        public abstract void find();
        public abstract void uodate();
        public abstract void delete();
        public abstract void add();
        public abstract void change();
    }

創建三個具體的組:

public class CodeGroup extends Group {
        @Override
        public void find() {
            System.out.println("找到程序組");
        }

        @Override
        public void update() {
            System.out.println("需要更新功能");
        }

        @Override
        public void delete() {
            System.out.println("需要刪除功能");
        }

        @Override
        public void add() {
            System.out.println("需要添加功能");
        }

    }

    public class PageGroup extends Group{
        @Override
        public void find() {
            System.out.println("找到前端組");
        }

        @Override
        public void update() {
            System.out.println("需要修改頁面");
        }

        @Override
        public void delete() {
            System.out.println("需要刪除頁面");
        }

        @Override
        public void add() {
            System.out.println("需要添加頁面");
        }
    }

    public class RequirementGroup extends Group {
        @Override
        public void find() {
            System.out.println("找到需求組");
        }

        @Override
        public void update() {
            System.out.println("需要更新需求");
        }

        @Override
        public void delete() {
            System.out.println("需要刪除需求");
        }

        @Override
        public void add() {
            System.out.println("需要添加需求");
        }
    }

創建抽象的命令類

public abstract class Command {
        //定義好具體的組,子類可以直接使用
        protected CodeGroup codeGroup = new CodeGroup();
        protected PageGroup pageGroup = new PageGroup();
        protected RequirementGroup requirementGroup = new RequirementGroup();
        public abstract void execute();
    }

創建具體的命令類

public class UpdatePageCommand extends Command {
        @Override
        public void execute() {
            //找到前端組
            super.pageGroup.find();
            //更新頁面
            super.pageGroup.update();
        }
    }
public class AddRequirementCommand extends Command {
        @Override
        public void execute() {
            super.requirementGroup.find();
            super.requirementGroup.add();
        }
    }

創建命令的負責人,也就是下達命令的類:

    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 invoker  = new Invoker();
            System.out.println("客戶提出修改頁面");
            Command command = new UpdatePageCommand();
            invoker.setCommand(command);
            invoker.action();
            System.out.println("\n客戶提出新的需求");
            Command command1 = new AddRequirementCommand();
            invoker.setCommand(command1);
            invoker.action();

        }
    }

發佈了71 篇原創文章 · 獲贊 89 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章