個人理解:把一個類別裡的多個命令分離出來,每個類別裡放一個命令,實現解耦合,一個類別只對應一個功能,在使用命令時由另一個類別來統一管理所有命令。
缺點:如果功能多了就會導致創建的類別的數量過多
命令模式(Command Pattern)是⼀種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給調⽤物件。調⽤對象尋找可以處理該指令的合適的對象,並把該指令傳給對應的對象,該對象執⾏指令。
意圖:將⼀個請求封裝成⼀個對象,從⽽使您可以⽤不同的請求對客戶進⾏參數化。
主要解決:在軟體系統中,⾏為請求者與⾏為實現者通常是⼀種緊密結合的關係,但某些場合,⽐如需要對⾏為進⾏記錄、撤銷或重做、事務等處理時,這種⽆法抵禦變化的緊密耦合的設計就不太合適。
何時使⽤:在某些場合,⽐如要對⾏為進⾏"記錄、撤銷/重做、事務"等處理,這種⽆法抵禦變化的緊密耦合是不合適的。在這種情況下,如何將"⾏為請求者"與"⾏為實現者"解耦?將⼀組⾏為抽象為對象,可以實現⼆者之間的鬆散耦合。
如何解決:透過調⽤者調⽤接受者執⾏命令,順序:調⽤者→命令→接受者。
關鍵程式碼:把類別裡的命令分離出去為其創建類,這些命令類有相同的父類。
優點:
降低了耦合度。
新的指令可以很容易地加入到系統中去。
缺點:使⽤命令模式可能會導致某些系統有過多的具體命令類別。
使⽤場景:認為是命令的地⽅都可以使⽤命令模式,⽐如: 1.GUI中每⼀個按鈕都是⼀條命令。 2.模擬CMD。
注意事項:系統需要⽀持指令的撤銷(Undo)操作與復原(Redo)操作,也可以考慮使⽤指令模式。
我們⾸先建立作為指令的接⼝Order,然後建立作為請求的Stock類別。實體指令類別BuyStock和SellStock,實作了 Order接⼝,將執⾏實際的指令處理。建立作為調⽤物件的類別Broker,它接受訂單並能下訂單。 Broker物件使⽤指令模式,基於指令的類型決定哪個物件執⾏哪個指令。 CommandPatternDemo類別使⽤Broker 類別來示範命令模式。
具體實作步驟
1.建立⼀個Java項⽬。
2.建立⼀個股票請求類別Stock。
package src.com.设计模式.命令模式; /* * 股票类 * */ public class Stock { private String name; private int quantity; public Stock(String name, int quantity) { this.name = name; this.quantity = quantity; } public void buy(){ System.out.println("股票买入成功"+name+",股数:"+quantity); } public void sell(){ System.out.println("股票卖出成功"+name+",股数: "+quantity); } }
3.建立⼀個指令接⼝Order。
package src.com.设计模式.命令模式; public interface Order { void execute(); }
4.建立實作了Order接⼝的實體類別BuyStock。
package src.com.设计模式.命令模式; public class BuyStock implements Order{ //依赖于Stock对象 private Stock stock; public BuyStock(Stock stock) { this.stock = stock; } @Override public void execute() { //购买目标股票的业务操作 stock.buy(); } }
5.建立實作了Order接⼝的實體類別SellStock。
package src.com.设计模式.命令模式; public class SellStock implements Order{ private Stock stock; public SellStock(Stock stock) { this.stock = stock; } @Override public void execute() { stock.sell(); } }
6.建立命令調⽤類別Broker。
package src.com.设计模式.命令模式; import java.util.ArrayList; import java.util.List; /* * 股票经纪人类 * */ public class Broker { private List<Order> orderList = new ArrayList<>(); //1.接受订单 public void takeOrder(Order order){ orderList.add(order); } //2.执行订单 public void placeOrders(){ orderList.forEach(fun ->{ fun.execute(); }); } }
7.建立CommandPatternDemo類,然後使⽤Broker類來接受並執⾏命令。
package src.com.设计模式.命令模式; public class CommandPatternDemo { public static void main(String[] args) { Stock stock = new Stock("002607",100); BuyStock buyStock = new BuyStock(stock); SellStock sellStock = new SellStock(stock); Broker broker = new Broker(); broker.takeOrder(buyStock); broker.takeOrder(sellStock); broker.placeOrders(); } }
8.執⾏程序,輸出結果。
以上是Java設計模式中的命令模式怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!