簡介
命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行爲型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找可以處理該命令的合適的對象,並把該命令傳給相應的對象,該對象執行命令。命令模式是一個高內聚的模式。
優點:
- 類間解耦;
- 可擴展性;
- 命令模式結合其他模式會更優秀
缺點:
使用命令模式可能會導致某些系統有過多的具體命令類。
類圖
在該類圖中,主要與三個角色:
- 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();
}
}