目次
戦略パターン
1. 戦略パターンとは
2. ストラテジー モードの長所と短所
これで 3 羽のアヒルができました:
ホームページ Java &#&チュートリアル コードを使用して Java の戦略パターンを実装する方法

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

May 18, 2023 pm 05:49 PM
java

    戦略パターン

    戦略パターンは、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 サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

    Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

    Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

    Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

    ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

    Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

    Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

    Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

    Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

    この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

    Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

    Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

    Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

    Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

    カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

    カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

    See all articles