溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java設(shè)計(jì)模式-命令模式(Command Pattern)

發(fā)布時(shí)間:2020-07-18 20:40:08 來源:網(wǎng)絡(luò) 閱讀:401 作者:nineteens 欄目:編程語言

  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í)行指令。


向AI問一下細(xì)節(jié)

免責(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)容。

AI