首頁  >  文章  >  Java  >  Java設計模式中的命令模式怎麼實現

Java設計模式中的命令模式怎麼實現

WBOY
WBOY轉載
2023-05-10 17:52:061383瀏覽

個人理解:把一個類別裡的多個命令分離出來,每個類別裡放一個命令,實現解耦合,一個類別只對應一個功能,在使用命令時由另一個類別來統一管理所有命令。

缺點:如果功能多了就會導致創建的類別的數量過多

命令模式(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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除