ホームページ  >  記事  >  Java  >  Java 設計パターン戦略パターンの例分析

Java 設計パターン戦略パターンの例分析

WBOY
WBOY転載
2023-05-02 16:49:071315ブラウズ

1. 基本的な紹介

1) ストラテジー パターンでは、アルゴリズム ファミリ (ストラテジー グループ) が個別に定義され、相互に置き換えることができるようにカプセル化されます。このモードでは、アルゴリズムの変更を独立して行うことができます。アルゴリズムを使用する人

2) このアルゴリズムは、いくつかの設計原則を具体化しています。第一に、変更するコードと未変更のコードを分離します。第二に、具体的なクラス (定義 (ポリシー インターフェイス) ではなくインターフェイス プログラミングを対象とします。第三に、組み合わせを使用します)。 /集約を多くし、継承を少なくする (お客様は組み合わせによる戦略を使用します)

例: 環境省エネルギーについては、ベースバンド ボードの省エネルギー、SPC の省エネルギー、製品の省エネルギー、さまざまな省エネルギーの 3 つの省エネルギー方法が提案されています。

#2. 従来の方法

# (1) クラス図

Java 設計パターン戦略パターンの例分析

(2) コーディング実装

1) EsPolicy 抽象クラスを定義し、esPolicyHandler メソッドを定義します

public abstract class EsPolicy {
    public void esPolicyHandler() {
    }
}

2) BbEsPolicy は EsPolicy を継承し、esPolicyHandler メソッドをオーバーライドします

public class BbEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===处理基带板节能策略===");
    }
}

3) SpcEsPolicy は EsPolicy を継承し、 esPolicyHandler メソッド

public class SpcEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===Spc节能策略处理===");
    }
}

4) ProdEsPolicy は EsPolicy を継承し、esPolicyHandler メソッドをオーバーライドします

public class ProdEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===产品节能策略处理===");
    }
}

5) テスト

public class EsPolicyTest {
    public static void main(String[] args) {
        EsPolicy bbEsPolicy = new BbEsPolicy();
        bbEsPolicy.esPolicyHandler();
        SpcEsPolicy spcEsPolicy = new SpcEsPolicy();
        spcEsPolicy.esPolicyHandler();
        ProdEsPolicy prodPolicy = new ProdEsPolicy();
        prodPolicy.esPolicyHandler();
    }
}

実行結果

===ベースバンド ボードの処理の省エネルギー戦略===

===Spc の省エネルギー戦略の処理===
===製品の省エネルギー戦略の処理===

問題: 従来の方法では、サブクラスが親クラスを継承し、親クラスのメソッドをオーバーライドすることで、異なるサブクラスの異なる動作を実現します。クラスへのローカルな変更、特にスーパークラスへのローカルな変更は、他の部分に影響を及ぼし、波及効果をもたらします

3. 戦略パターンの採用

(1) クラス図

Java 設計パターン戦略パターンの例分析

(2) コーディング実装

1) 戦略の定義インターフェイスと抽象メソッドを定義します

public interface EsPolicyHandler {
    void esPolicyHandler();
}

2) BbEsPolicyHandler はポリシー インターフェイスを実装し、esPolicyHandler メソッドを実装します

public class BbEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===基带板节能策略处理===");
    }
}

3) SpcEsPolicyHandler はポリシー インターフェイスを実装し、esPolicyHandler メソッドを実装します

public class SpcEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===Spc节能策略处理===");
    }
}

4) ProdEsPolicyHandler ポリシー インターフェイスを実装し、esPolicyHandler メソッドを実装します

public class ProdEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===产品节能策略处理===");
    }
}

5) EsPolicy 抽象クラスを定義し、その属性として EsPolicyHandler を挿入します

public abstract class EsPolicy {
    EsPolicyHandler esPolicyHandler;
    public void setEsPolicyHandler(EsPolicyHandler esPolicyHandler) {
        this.esPolicyHandler = esPolicyHandler;
    }
    public void esPolicyHandler() {
        if (null != esPolicyHandler) {
            esPolicyHandler.esPolicyHandler();
        }
    }
}

6) BbEsPolicy は EsPolicy を継承し、esPolicyHandler インターフェイス属性をインスタンス化しますコンストラクター内

public class BbEsPolicy extends EsPolicy {
    public BbEsPolicy() {
        esPolicyHandler = new BbEsPolicyHandler();
    }
}

7) SpcEsPolicy は EsPolicy を継承し、コンストラクター

public class SpcEsPolicy extends EsPolicy {
    public SpcEsPolicy() {
        esPolicyHandler = new SpcEsPolicyHandler();
    }
}

で esPolicyHandler インターフェース プロパティをインスタンス化します。8) ProdEsPolicy は EsPolicy を継承し、コンストラクター

public class ProdEsPolicy extends EsPolicy {
    public ProdEsPolicy() {
        esPolicyHandler = new ProdEsPolicyHandler();
    }
}
# で esPolicyHandler インターフェース プロパティをインスタンス化します。 ## 9) テスト

public class EsPolicyTest {
    public static void main(String[] args) {
        BbEsPolicy bbEsPolicy = new BbEsPolicy();
        bbEsPolicy.esPolicyHandler();
        SpcEsPolicy spcEsPolicy = new SpcEsPolicy();
        spcEsPolicy.esPolicyHandler();
        ProdEsPolicy prodEsPolicy = new ProdEsPolicy();
        prodEsPolicy.esPolicyHandler();
    }
}

10) 実行結果

===ベースバンド ボードの省エネ戦略の処理===
===Spc の省エネ戦略の処理===

===製品省エネ戦略処理===

4.戦略モデルの注意事項と詳細

1) 戦略モデルのポイントは: プロジェクトの変更部分と変更されていない部分を分析する パート

2) 戦略パターンの核となるアイデアは次のとおりです: 組み合わせ/集約をより多く使用し、継承を少なくする; 動作の継承の代わりに動作クラスの組み合わせを使用するこれはより柔軟です;

3) 「変更には近く、拡張にはオープン」の原則を体現しており、クライアントは元のコードを変更せずに動作を追加します。追加する必要があるのは戦略 (または動作) だけであり、複数の転送ステートメントの使用 (if.​​..else if...else)

4) 継承関係を置き換える方法を提供します。ストラテジ パターンはアルゴリズムを独立したストラテジ クラスにカプセル化し、変更できるようにします。コンテキストから独立しているため、切り替え、理解、拡張が容易になります

5) ストラテジーが追加されるたびに、クラスも追加されることに注意してください。多くの戦略を使用すると、膨大な数のクラスが生成されます。

以上がJava 設計パターン戦略パターンの例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。