コードを使用して Java の戦略パターンを実装する方法

王林
リリース: 2023-05-18 17:49:34
転載
1501 人が閲覧しました

    戦略パターン

    戦略パターンは、Java の 23 の動作パターンの 1 つです。まず、戦略パターンが何であるかを見てみましょう。

    1. 戦略パターンとは

    戦略パターンの定義:

    この設計パターンは、一連のアルゴリズムをカプセル化して、アルゴリズムの変更はクライアントの使用には影響しません。戦略パターンはオブジェクトの動作パターンに属し、アルゴリズムをカプセル化し、アルゴリズムの使用責任をアルゴリズムの実装から分離し、これらのアルゴリズムの管理を別のオブジェクトに委任します。

    実際、実生活では、特定の目標を達成するために複数の戦略から選択できる状況によく遭遇します。たとえば、旅行するときは、飛行機に乗ったり、電車に乗ったり、自転車に乗ったり、または自分の専用車を運転することもできます。 または、たとえば、オンライン ショッピングの場合、中国工商銀行、中国農業銀行、中国建設銀行などを選択できますが、提供されるアルゴリズムはすべて同じであり、支払いを支援します。

    ソフトウェア開発でも同様の状況に遭遇することがありますが、ある機能を実装するために複数のアルゴリズムや戦略がある場合、さまざまな環境や条件に応じて、異なるアルゴリズムや戦略を選択して機能を完成させることができます。関数。

    2. ストラテジー モードの長所と短所

    利点:

    • ##複数の条件ステートメントは保守が困難ですが、ストラテジーを使用します。モードでは、複数の条件ステートメントの使用を回避できます。

      継承を通じて、アルゴリズム ファミリのパブリック コードを親クラスに配置して、コードの再利用を回避し、一連の再利用可能なアルゴリズムを提供できます
    • 同じ動作をさまざまな実装で実現します。お客様は、時間やスペースの要件に応じて異なるものを選択できます。
    • オープニングとクロージングを完璧にサポートします。原則として、元のコードを変更せずに新しいアルゴリズムを柔軟に追加し、アルゴリズム
    • の使用を環境クラスに配置し、アルゴリズムの実装を特定の戦略クラスに移動することで、次のことを実現できます。演算子の分離
    • 欠点:

    クライアントは、すべての戦略アルゴリズムの違いを順番に理解する必要があります。適切なタイミングで適切なものを選択するため アルゴリズム クラス
    • 戦略モデルは多くの戦略クラスを作成するため、メンテナンスの難易度が高くなります
    • 3 . 戦略モデルの構造
    1 . 抽象戦略クラス: パブリック インターフェイスを定義します。さまざまなアルゴリズムがさまざまな方法でこのインターフェイスを実装します。環境の役割は、このインターフェイスを使用して、さまざまなアルゴリズムを呼び出します (通常はインターフェイスまたは抽象クラスを使用します)。

    2. 特定の戦略クラス: 抽象戦略によって定義されたインターフェイスを実装し、特定のアルゴリズムの実装を提供します。

    3. 環境クラス: 最終的にクライアントによって呼び出される戦略クラスへの参照を保持します。

    構造図:

    4. コードの実装コードを使用して Java の戦略パターンを実装する方法

    これで 3 羽のアヒルができました:

    緑のアヒル、赤いアヒル、小さなアヒル (小さなアヒルはまだ飛べません)

    ここでアヒルの親クラスを定義します:

    吠え声と外観のメソッドがあります。それぞれ異なるため、サブクラスで書き直す必要があります)

    飛行することもできます (ここでは戦略モードが使用されます)

    public  abstract class duck {
        //鸭子都会叫:
        public void quack(){
            System.out.println("嘎嘎嘎");
        }
        //鸭子的外观,因为都不一样,所以由子类去实现
        public abstract void display();
    	
    	//以下使用策略模式:
        //在父类中持有该接口,并由该接口代替飞行行为(组合)
        private Flying flying;
        //提供set方法
        public void setFlying(Flying flying) {
            this.flying = flying;
        }
        public void fly(){
            flying.Fly();
        }
    }
    ログイン後にコピー
    飛行インターフェイスを定義します:

    /**
     * 策略接口:实现了鸭子的飞行行为
     */
    public interface Flying {
        void Fly();
    }
    ログイン後にコピー
    ストラテジー モードでは、使用する必要があるアルゴリズムをカプセル化することがわかっており、flying

    と ## を別の

    package## にカプセル化します。 # #Cannot Fly の 2 つのメソッド: Can fly (上記のフライト インターフェイスに継承され、フライト メソッドをオーバーライド):

    public class FlyWithWin implements Flying {
        @Override
        public void Fly() {
            System.out.println("我会飞");
        }
    }
    ログイン後にコピー

    Can 't fly:

    public class FlyNoWay implements Flying {
        @Override
        public void Fly() {
            System.out.println("我不会飞行");
        }
    }
    ログイン後にコピー

    注: 上記の 2 つのメソッドをアルゴリズム ファミリとして個別にカプセル化し、プログラムがいずれかのアルゴリズムを使用する必要がある場合、プログラムはアルゴリズムの最終的な効果は同じであるため、アルゴリズムの変更の影響を受けません。

    赤い羽根のアヒル:

    /**
     * 红色鸭子
     */
    public class RedDuck extends duck{
        public RedDuck(){
            super();
            //给鸭子注入飞行的能力,这里就是通过算法族里面的会飞的算法
            super.setFlying(new FlyWithWin());
        }
        @Override
        public void display() {
            System.out.println("我是红色的鸭子");
        }
    }
    ログイン後にコピー

    緑の羽根のアヒル:

    /**
     *
     * 绿色鸭子
     */
    public class GreenDuck extends duck{
        public GreenDuck(){
            super();
            //给鸭子注入飞行的能力,这里也是通过算法族里面的会飞的算法
            super.setFlying(new FlyWithWin());
        }
        @Override
        public void display() {
            System.out.println("我是绿色的鸭子");
        }
    }
    ログイン後にコピー

    小さなアヒルの種類 (飛べない):

    /**
     * 小鸭子,还不会飞
     */
    public class SamllDuck extends duck{
        public SamllDuck(){
            super();
            //小鸭子不会飞,所以使用了算法族里面不会飞的算法
            super.setFlying(new FlyNoWay());
        }
    
        @Override
        public void display() {
            System.out.println("我还是小鸭子");
        }
        //因为小鸭子和大鸭子的叫声不一样,所以重写叫声方法
        public void quack(){
            System.out.println("嘎~嘎~嘎");
        }
    }
    ログイン後にコピー

    テストの種類:

    public class Test {
        public static void main(String[] args) {
            System.out.println("***测试鸭子程序***");
            duck d = null;
    		//这下面是轮流运行!!!!  
            d = new RedDuck();  //测试红色的鸭子
            d = new GreenDuck();  //测试绿色的鸭子
            d = new SamllDuck();  //测试小鸭子
            d.display();
            d.quack();
            d.fly();
            System.out.println("***测试完毕***");
        }
    }
    ログイン後にコピー

    ##オブジェクトとしての赤いアヒル:

    ##***アヒル プログラムのテスト***

    私は赤いアヒルです

    クワック私は飛べます ***テスト完了***


    マガモをオブジェクトとして使用する場合:

    ***测试鸭子程序***
    我是绿色的鸭子
    嘎嘎嘎
    我会飞
    ***测试完毕***
    ログイン後にコピー

    コガモをオブジェクトとして使用する場合 オブジェクトの場合:

    ***テストアヒルプログラム***

    私はまだ小さなアヒルです

    qua~qua~qua私は飛べません* **テスト完了***

    5. 戦略モードのアプリケーション シナリオ

    1. システムが複数のアルゴリズムのうち 1 つを動的に選択する必要がある場合、それぞれのアルゴリズムは、 Strategy クラス

    2. クラスは複数の動作を定義しており、これらの動作は、このクラスの操作で複数の条件ステートメントの形式で表示されます。各条件分岐はそれぞれのストラテジ クラスに移動できます。ステートメントは置き換えることができます

    3. システム内のアルゴリズムが互いに完全に独立しており、特定のアルゴリズムの実装の詳細を顧客から隠す必要がある場合

    4. アルゴリズムを使用する顧客が操作対象のデータを知られないようにシステムが要求する場合、戦略パターンを使用してアルゴリズムに関連するデータ構造を隠すことができます

    5. の唯一の違いは複数のクラスはそれぞれ異なるパフォーマンス動作を示します。戦略パターンを使用して、実行時に実行する特定の動作を動的に選択できます

    以上がコードを使用して Java の戦略パターンを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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