您好,登錄后才能下訂單哦!
1.什么是命令模式
命令模式(Command Pattern)是一種數(shù)據(jù)驅(qū)動(dòng)的設(shè)計(jì)模式,它屬于行為型模式。請(qǐng)求以命令的形式包裹在對(duì)象中,并傳給調(diào)用對(duì)象。調(diào)用對(duì)象尋找可以處理該命令的合適的對(duì)象,并把該命令傳給相應(yīng)的對(duì)象,最終把命令給執(zhí)行掉。
使用場(chǎng)景:認(rèn)為是命令的地方都可以使用命令模式。
2.命令模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 1、降低了系統(tǒng)耦合度。 2、新的命令可以很容易添加到系統(tǒng)中去。
缺點(diǎn):使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類。
3.典型案例
貨物進(jìn)出倉庫,指令員給庫方管理人員下達(dá)進(jìn)出貨物的指令,庫方管理員根據(jù)指令進(jìn)行貨物的進(jìn)出倉庫。
4.代碼實(shí)現(xiàn)
關(guān)鍵代碼:定義三個(gè)角色:1、真正的命令執(zhí)行對(duì)象(Worker) 2、命令(Order) 3、使用命令對(duì)象的入口(Treasurer)
步驟1:創(chuàng)建命令接口(Order)
package com.yx.demo.cmd;
/**
* Order
* 指令接口
*
* @author yx
* @date 2019/11/30 20:57
*/
public interface Order {
void execute();
}
步驟2:創(chuàng)建命令最終執(zhí)行對(duì)象(Worker)。
package com.yx.demo.cmd;
/**
* 工人
*
* 真正命令的執(zhí)行對(duì)象
*
* @author yx
* @date 2019/11/30 22:06
*/
public class Worker {
private String name = "Goods A";
private int num = 5;
public void importGoods() {
System.out.println("Goods [ Name: " + name + ",num: " + num + " ] import");
}
public void exportGood() {
System.out.println("Goods [ Name: " + name + ",num: " + num + " ] export");
}
}
步驟3:創(chuàng)建Order接口實(shí)體類,一個(gè)用于進(jìn)貨,一個(gè)用于出貨。
package com.yx.demo.cmd;
/**
* ImportGoods
* 進(jìn)貨指令
*
* @author yx
* @date 2019/11/30 22:19
*/
public class ImportGoods implements Order {
private Worker mWorker;
public ImportGoods(Worker worker) {
this.mWorker = worker;
}
@Override
public void execute() {
mWorker.importGoods();
}
}
package com.yx.demo.cmd;
/**
* ExportGoods
* 出貨指令
*
* @author yx
* @date 2019/11/30 22:17
*/鄭州婦科醫(yī)院 http://www.ytsgfk120.com/
public class ExportGoods implements Order {
private Worker mWorker;
public ExportGoods(Worker worker) {
this.mWorker = worker;
}
@Override
public void execute() {
mWorker.exportGood();
}
}
步驟 4 創(chuàng)建庫房管理員類(Treasurer)。
主要處理接受指令和處理指令,供領(lǐng)導(dǎo)使用。
package com.yx.demo.cmd;
import java.util.ArrayList;
import java.util.List;
/**
* Treasurer
* 倉庫管理員
* 使用命令對(duì)象的入口
*
* @author yx
* @date 2019/11/30 22:35
*/
public class Treasurer {
private List orderList = new ArrayList();
public void acceptOrder(Order order) {
orderList.add(order);
}
public void dealOrders() {
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
步驟5:demo演示,庫房管理員接受指令和處理指令
package com.yx.demo.cmd;
/**
* CommandPatternDemo
* 測(cè)試類
*
* @author yx
* @date 2019/11/30 22:41
*/
public class CommandPatternDemo {
public static void main(String[] args) {
Worker worker = new Worker();
ImportGoods importGoods = new ImportGoods(worker);
ExportGoods exportGoods = new ExportGoods(worker);
Treasurer treasurer = new Treasurer();
treasurer.acceptOrder(importGoods);
treasurer.acceptOrder(exportGoods);
treasurer.dealOrders();
}
}
示例中:進(jìn)出貨物的請(qǐng)求,封裝在ImportGoods和ExportGoods中,領(lǐng)導(dǎo)將指令需求指派給庫房管理員Treasurer處理,至于Treasurer怎么處理交給哪個(gè)工人處理,領(lǐng)導(dǎo)不關(guān)心,倉庫管理員進(jìn)出貨物找具體的工人執(zhí)行指令。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。