Javaデザインパターンでコマンドパターンを実装する方法

WBOY
リリース: 2023-05-10 17:52:06
転載
1385 人が閲覧しました

個人的な理解: 複数のコマンドをクラスに分けて、それぞれのクラスに1つのコマンドを入れて分離する、1つのクラスは1つの機能にのみ対応する、コマンドを使用する場合は別のクラスが全てのコマンドを統一的に管理する。

欠点: 関数が多すぎると、作成されるクラスが多すぎます。

コマンド パターンはデータ駆動型の設計パターンであり、動作モデルです。リクエストはコマンド形式のオブジェクトにラップされ、呼び出し元のオブジェクトに渡されます。呼び出し元のオブジェクトは、コマンドを処理できる適切なオブジェクトを探し、対応するオブジェクトにコマンドを渡し、そこでコマンドが実行されます。

はじめに

目的: リクエストをオブジェクトにカプセル化し、さまざまなリクエストを持つクライアントをパラメータ化できるようにします。

主な解決策: ソフトウェア システムでは、動作要求者と動作実装者は通常、密結合関係にありますが、場合によっては、動作の記録、キャンセル、やり直しが必要になる場合もあります。この種の密結合設計変化に耐えられない人は、ビジネスや取引処理などには適していません。

使用する場合: 「記録、元に戻す/やり直し、トランザクション」やその他のアクションの処理などの状況では、変更に耐えられないこの種の密結合は不適切です。この場合、「動作要求者」と「動作実装者」をどのように分離すればよいでしょうか?一連の動作をオブジェクトに抽象化すると、それらの間の疎結合を実現できます。

解決方法: 発信者を通じて受信者を呼び出してコマンドを実行します。順序は呼び出し者→コマンド→受信者です。

キー コード: クラス内のコマンドを分離してクラスを作成します。これらのコマンド クラスは同じ親クラスを持ちます。

利点:

  • カップリングが減少します。

  • 新しいコマンドをシステムに簡単に追加できます。

欠点: コマンド モードを使用すると、一部のシステムで特定のコマンド クラスが多すぎる可能性があります。

使用シナリオ: コマンド モードは、コマンドを考慮する場合はどこでも使用できます。たとえば、次のとおりです。 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート