ポリシー・モードとステータス・モード

5469 ワード

転ぶのも怖くないから
この文書の知識点の概要:
  • ポリシーモードとステータスモードの基本概念
  • ポリシーモードとステータスモードの違い
  • ポリシーモードとステータスモードの実際のシーンでの使用
  • 1.戦略モードと状態モードの基本概念
  • ポリシーモードは一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、互いに置き換えることができ、ポリシーモードはアルゴリズムを使用する顧客とは独立して独立に変化させる.
  • 状態モードは、オブジェクトの内部状態が変化すると、そのクラスが変化するように開く動作を変化させることができる.

  • 2.ポリシーモードとステータスモードの違い
    最初はこの2つのデザインパターンが分からなかったのですが、なぜそう言ったのでしょうか.どちらのデザインモードにも対応する選択状態があるため、主な違いを覚えていれば対応するデザインモードをよく区別することができ、ステータスモードパッケージは内在的な行為ですが、ユーザーは知りません(ここで最も古典的な例はログインの問題について、後で説明します)、ポリシーモードパッケージは一連のアルゴリズムです.ユーザに選択可能である.実は2つのデザインモデルは実の兄弟と言えるが、基本的な実現は多くない.
  • ポリシーモード:カプセル化されたいくつかの列のアルゴリズムはユーザーが自分で選択するために、主に一連のアルゴリズムに対して、ユーザーは自分で選択することができる.
  • 状態モード:パッケージは内部の運転状態であるが、対外的には見えない
  • である.
    3.ポリシーモードとステータスモードの実際の使用シーン
    3.1ポリシーモードの使用シーン
  • 同じタイプの問題に対する多様な処理方式は、具体的な行為に違いがある場合に限られる.
  • は、複数の同じタイプの動作を安全にカプセル化する必要がある.
  • 同じ抽象クラスに複数のサブクラスが出現し、if-elseまたはswitch-caseを使用して特定のサブクラスを選択する必要がある場合
  • .
    ここで例を挙げましょう.皆さんによく理解してもらいます.
    私达はふだんすべて游びに行くことが好きで、私は北京で出かける时すべて地図を调べて、それから相応の会出の多くのルートは私に选択させて、実はここは时に1つの相応のルートの策略で、あなたは地下鉄あるいはバスで行くことができます.これが対応するユーザーの選択です.彼らは対応するポリシーを提供しているだけです.ユーザーがどのように私たちを選択しても...具体的なコード実装を見てみましょう.
  • 最初にルートの宛先インタフェース
  • を作成する.
    public interface TravelRoute {
    
        /**
         * author :     
         * create time : 2017/12/23 18:35
         * description :       
         */
        void destination();
    }
    

    まず、このクラスの役割は、目的地のベースクラスを提供することであり、主に後の多態の使用のために準備する.ここの策略はユーザーを通じて設定するので、ここに相応のクラスを設定すると、インタフェースがいいですが、実は抽象クラスを書いてもいいです.慣れているのを見てください.
  • 地下鉄の実装クラス(選択可能な実装クラス、すなわちその1つの選択)
  • public class Subway implements TravelRoute {
        @Override
        public void destination() {
            System.out.println("       ");
        }
    }
    
  • バス移動の実現類(提供可能な別の実現類であり、その一つの選択でもある)
  • public class Bus implements TravelRoute {
        @Override
        public void destination() {
            System.out.println("       ");
        }
    }
    
  • 対応する制御クラス(ここでもこのクラスによって対応するポリシーを行う)
  • public class TravelRouteSelect implements TravelRoute{
    
        private TravelRoute mRoute;
    
        public TravelRouteSelect() {
        }
    
        public void setTeavelRouteStatus(TravelRoute travelRoute){
            this.mRoute = travelRoute;
        }
    
        @Override
        public void destination() {
            /*       */
            mRoute.destination();
        }
    }
    
  • 具体的な呼び出し
  •     public static void main(String[] args) {
            TravelRouteSelect select = new TravelRouteSelect();
            select.setTeavelRouteStatus(new Subway());//            
            select.destination();
        }
    
  • 対応出力
  •        
    

    上は1つの策略モードの簡単な実現で、実は主に相応の制御クラスの中で提供する1つの相応の設置の方法で、これは最も主要な地方で、ここは相応の策略を設置することを通じて、外出の方式も相応の変化が発生しました.
    注意点
  • まずsetTeavelRouteStatus(TravelRoute travelRoute)メソッドあなたが呼び出さないと、空のポインタが異常になる場合があります.最初はこの問題に気づかなかったのですが、後で考えてみると、ここではプログラム的にユーザーに適切な選択をして、ユーザーが空の状況を選択しないようにするかもしれませんが、実は簡単です.対応する制御クラスがTravelRoute travelRouteを作成するときに直接1つのオブジェクトに対応すればよい.これにより、適切な移動方法を選択しなくても、デフォルトで移動方法があります.
  • 実際にはインタフェースを適用してベースクラスを作成することはできません.例えば、サブクラスにいくつかの共通の方法があれば、ここでは対応する方法を提案して、抽象的なクラスで実現すればいいです.

  • 3.2状態モードの使用シーン
  • オブジェクトの動作は、そのステータスに依存し、実行時にステータスに応じて動作を変更する必要があります.
  • コードには、オブジェクトの状態に関連する条件文が多数含まれています.
  • 状態モードは、各条件分岐を独立したクラスに配置する.これは、オブジェクト自体の状況に応じてオブジェクトの状態をオブジェクトとすることができ、このオブジェクトは他のオブジェクトに依存することなく独立して存在することができ、このように多くのエラーの重複したif-elseなどの分岐文
  • を除去することができる.
    ここでは、プロジェクトの実際の例を挙げて説明します.
    プロジェクト中に観光客モードがある場合は、該当するボタンをクリックして該当するログインロジックを判断し、ログインしていない場合は、ログイン操作を行い、ログインすれば指定されたページに行きます!一般的なappはこのような論理であるが、実現の方法は千差万別である.最初は私もいろいろなif-elseの判断でした.
  • ログイン状態のインタフェース(主に対応する未ログインおよびログインの対応する実装を提供する)
  • .
    public interface LoginSelect {
        /**
         * author :     
         * create time : 2017/12/23 19:20
         * description :        
         */
        void loginSelect();
    }
    
  • 対応するログインの状態
  • public class LoginStatus implements LoginSelect {
        @Override
        public void loginSelect() {
            System.out.println("     ,      ");
        }
    }
    
  • 対応の未登録状態
  • public class NoLoginStatus implements LoginSelect {
        @Override
        public void loginSelect() {
            System.out.println("      ,       ");
        }
    }
    
  • 対応制御クラス
  • public class LoginControl implements LoginSelect {
        private LoginSelect mLoginSelect;
    
        public LoginControl() {
        }
    
        @Override
        public void loginSelect() {
            if (           ) {
                setStatus(new LoginStatus());
            } else {
                setStatus(new NoLoginStatus());
            }
            mLoginSelect.loginSelect();
        }
    
        private void setStatus(LoginSelect status) {
            mLoginSelect = status;
        }
    }
    
  • 対応する呼び出し
  •     public static void main(String[] args) {
            LoginControl control = new LoginControl();
            control.loginSelect();
        }
    

    上は1つの相応の状態のモードの実現で、ここは実はあなたは多種の状態を設定することができて、ある人はあなたがこんなに多くのコードを書いて1つのこのような簡単な論理を実現すると言って、少し大げさな問題があるのではありませんか、実はそうではありませんて、あなたはこのような問題を考えて、例えばあなた达のプロジェクトの中でこのような操作があって、しかしある日製品が走って1種の状態をプラスして、あなたはどのようにしますか、相応のコードの地方まで走るのは1回プラスして、私にどうして闻かないでください、以前の私がこのような事をしたことがあるため、どんなにつらいことかは言わないでください....
    実は戦略モードと状態モードの実現方法はすべて類似していて、私の理解の中で、ただ2つのモードの作用は異なって、実は書き方の上ですべて悪くなくて、戦略モードは主に相応のアルゴリズムをパッケージして、ユーザーが自分で選択するために供する.状態モードは行為をカプセル化するが、実はこのような行為はユーザーにとって、知らないかもしれないが、コードの中ですでに相応の処理をしている.
    何か問題や間違いがあったら、すぐに指摘して、すぐに訂正してください.