1. 程式人生 > >JAVA的23種設計模式---命令模式

JAVA的23種設計模式---命令模式

概要:

該文章參考了《設計模式之禪》一書及一些前輩的部落格文章

1.該文章闡述了命令模式的基礎原理及示例程式碼;
2.該文章適合初學設計模式的技術人員研習;
3.該文章有許多不足之處,請各位大咖指正,噴子繞道;

正文:

命令模式:高內聚的模式,將一個請求封裝成一個物件,從而讓你使用不同的請求把客戶端引數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能

1.命令模式示例程式碼實現:

命令角色 類:

package com.csdn;
/**
 * 抽象 命令角色 類
 * @author Administrator
 *
 */
public abstract class
Command {
//子類直接使用 protected RequirementGroup rg = new RequirementGroup(); protected PageGroup pg = new PageGroup(); protected CodeGroup cg = new CodeGroup(); public abstract void execute(); }
package com.csdn;
/**
 * 增加需求命令
 * @author Administrator
 *
 */
public class AddRequirementCommand
extends Command{
@Override public void execute() { super.rg.find(); super.rg.add(); super.pg.add(); super.cg.add(); super.rg.plan(); } }
package com.csdn;
/**
 * 刪除頁面回滾命令
 * @author Administrator
 *
 */
public class CancelDeletePageCommand extends
Command{
@Override public void execute() { super.rg.rollBack(); } }

接收角色 類:

package com.csdn;
/**
 * 抽象 接收角色 類
 * @author Administrator
 *
 */
public interface Group {
    //找到組
    public void find();
    //提出增加
    public void add();
    //提出刪除
    public void delete();
    //提出修改
    public void change();
    //給出計劃
    public void plan();
    //根據日誌進行回滾
    public void rollBack();
}
package com.csdn;
/**
 * 需求組,具體接收者
 * @author Administrator
 *
 */
public class RequirementGroup implements Group{
    @Override
    public void find() {
        System.out.println("找到需求組..");
    }
    @Override
    public void add() {
        System.out.println("跟需求組提出增加需求..");
    }
    @Override
    public void delete() {
        System.out.println("跟需求組提出刪除需求..");
    }
    @Override
    public void change() {
        System.out.println("跟需求組提出變更需求..");
    }
    @Override
    public void plan() {
        System.out.println("需求組給出需求變更計劃..");
    }
    @Override
    public void rollBack() {
        System.out.println("跟需求組提出撤回需求..");
    }
}
package com.csdn;
/**
 * UI組,具體接收者
 * @author Administrator
 *
 */
public class PageGroup implements Group{
    @Override
    public void find() {
        System.out.println("找到UI組..");
    }
    @Override
    public void add() {
        System.out.println("跟UI組提出增加頁面..");
    }
    @Override
    public void delete() {
        System.out.println("跟UI組提出刪除頁面..");
    }
    @Override
    public void change() {
        System.out.println("跟UI組提出變更頁面..");
    }
    @Override
    public void plan() {
        System.out.println("UI組給出頁面變更計劃..");
    }
    @Override
    public void rollBack() {
        System.out.println("跟UI組提出撤回頁面..");
    }
}
package com.csdn;
/**
 * 程式碼組,具體接收者
 * @author Administrator
 *
 */
public class CodeGroup implements Group{
    @Override
    public void find() {
        System.out.println("找到程式碼組..");
    }
    @Override
    public void add() {
        System.out.println("跟程式碼組提出增加功能..");
    }
    @Override
    public void delete() {
        System.out.println("跟程式碼組提出刪除功能..");
    }
    @Override
    public void change() {
        System.out.println("跟程式碼組提出變更功能..");
    }
    @Override
    public void plan() {
        System.out.println("程式碼組給出功能變更計劃..");
    }
    @Override
    public void rollBack() {
        System.out.println("跟程式碼組提出撤回功能..");
    }
}

呼叫角色 類:

package com.csdn;
/**
 * 抽象 呼叫角色 類
 * @author Administrator
 *
 */
public class Invoker {
    private Command command;
    public void setCommand(Command _command){
        this.command = _command;
    }
    public void action(){
        this.command.execute();
    }
}

模擬場景:

package com.csdn;
/**
 * 模擬場景
 * @author Administrator
 *
 */
public class Client {
    public static void main(String[] args) {
        //建立呼叫者
        Invoker csdn = new Invoker();
        //提出增加需求命令
        Command addRequirement = new AddRequirementCommand();
        //傳達命令
        csdn.setCommand(addRequirement);
        //執行命令
        csdn.action();
        System.out.println("<----------->");
        //提出刪除頁面回滾命令
        Command cancel = new CancelDeletePageCommand();
        //傳達命令
        csdn.setCommand(cancel);
        //執行命令
        csdn.action();
    }
}

輸出:

找到需求組..
跟需求組提出增加需求..
跟UI組提出增加頁面..
跟程式碼組提出增加功能..
需求組給出需求變更計劃..
<----------->
跟需求組提出撤回需求..

注:
a:命令模式中有三個角色:接收者角色,命令角色,呼叫者角色
b:命令模式將請求方和執行方分開,將請求的具體處理方式進行封裝,使用者只要發出請求,不需要知道具體的處理步驟就可以得到想要的答案,擴充套件性也有很好保障