JAVA的23種設計模式---命令模式
阿新 • • 發佈:2019-02-12
概要:
該文章參考了《設計模式之禪》一書及一些前輩的部落格文章
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:命令模式將請求方和執行方分開,將請求的具體處理方式進行封裝,使用者只要發出請求,不需要知道具體的處理步驟就可以得到想要的答案,擴充套件性也有很好保障