Java命令模式


 

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();


    }


}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM