Android設計モード-ポリシーモードとステータスモード

4805 ワード

ポリシー・モード
ポリシーモードを見た後、本当に自分が以前書いたコードの多くが醜いことに気づきました.特にif-elseがあるとき、ポリシーモードは私がコードをどのように最適化するか分からない問題を解決しました.次に、ポリシーモードの基本的な実現を見てみましょう.
ポリシー・モード定義
ポリシー・モードは、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、相互に変換することもできます.ポリシー・モードは、アルゴリズムを使用する顧客とは独立して独立させます.
ポリシーモードの使用シーン
  • 同じ種類の問題に対する多様な処理方式は、具体的な行為に差がある場合にのみ
  • である.
  • 同じタイプの動作を安全にカプセル化する必要がある場合
  • .
  • 同じ抽象クラスに複数のサブクラスが出現し、if-elseまたはswitch-caseを使用して特定のサブクラスを選択する必要がある場合
  • .
    ポリシー・モードのシンプルな実装
    私たちが移動して交通手段を選ぶ例では、異なる交通手段を選ぶのにかかる価格が異なる(アルゴリズム)ため、多くの選択肢があります.
    これは、if-elseコードの移動方法を選択します.
    int calculatePrice(int km,int type){
        if(type == BUS)
            return busPrice(km);
        else if(type == SUBWAY)
            reutrn subwayPrice(km);
        return 0;
    }
    

    このコードスタイルは私がよく使う形式で、最も影響が深いのは登録を検出して判断する時、いくつかの入力が規格に合っているかどうか、多くのif-elseがあって、特に煩雑です.
    ポリシーモードは、サブクラスを継承し、最後にcontextで実装できるポリシーインタフェースを提供します.
    public interface CalculateStrategy{
        //       
        int calculatePrice(int km);
    }
    

    バスの価格計算ポリシー
    public class BusStrategy implements CalculateStrategy{
        public int calculatePrice(int km){
            //     
        }
    }
    

    地下鉄価格計算戦略
    public class SubwayStrategy implements CalculateStrategy{
        public int calculatePrice(int km){
            //     
        }
    }
    

    バス移動価格計算機
    public class TranficCalculator{
        public static void main(String[] args){
            TranficCalculator calculator = new  TranficCalculator();
            //      
            calculator.setStrategy(new BusStrategy());
            calculator.calculatePrice(20);
        }
        
        CalculateStrategy mStrategy;
        public void setStrategy(CalculateStrategy mStrategy){
            this.mStrategy = mStrategy;
        }
        
        public int calculatePrice(int km){
            return mStrategy.calculatePrice(km);
        }
    }
    

    ポリシーモードUML図
    ステータスモード
    ステータスモード定義
    オブジェクトの内部状態が変化すると、その動作を変更できます.このオブジェクトはクラスを変更したように見えます.
    ステートモードの使用シーン
  • オブジェクトの動作は、そのステータスに依存し、実行時にステータスに応じて動作を変更する必要があります.
  • コードには、オブジェクトの状態に関連する条件文が多数含まれています.

  • 状態モードの簡単な例
    コードシーン:テレビのリモコンには2つの状態があり、電源を入れた状態と電源を切った状態があります.電源を入れた状態で1チャンネル、次のチャンネル、音量を上げ、音量を下げることができます.
    テレビの状態の方法のインタフェース、テレビの操作の関数を定義しました
    public interface TvState{
        public void nextChannel();
        public void prevChannel();
        public void turnUp();
        public void turnDown();
    }
    

    無効なシャットダウン状態
    public class PowerOffState implements TvState{
        @override
        public void nextChannel(){
            
        }
        
        @override
        public void prevChannel(){
            
        }
        
        @override
        public void turnUp(){
            
        }
        
        @override
        public void turnDown(){
            
        }
    }
    

    電源オンの状態
    public class PowerOnState implements TvState{
            @override
        public void nextChannel(){
            System.out.println("    ");
        }
        
        @override
        public void prevChannel(){
             System.out.println("    ");
        }
        
        @override
        public void turnUp(){
             System.out.println("    ");
        }
        
        @override
        public void turnDown(){
             System.out.println("    ");
        }
    }
    

    電源操作コネクタ
    public interface PowerController{
        public void powerOn();
        public void powerOff();
    }
    

    TVリモコンは、入力された状態に応じて対応する操作を実行します.
    public class TvController implements PowerController{
        TvState mTvState;
        
        public void setTvState(TvState mTvState){
            this.mTvState = mTvState;
        }
        
        @override
        public void powerOn(){
            setTvState(new PowerOnState());
            System.out.println("   ");
        }
        
        @override
        public void powerOff(){
            setTvState(new PowerOffState());
            System.out.println("   ");
        }
        
        public void nextChannel(){
            mTvState.nextChannel();
        }
        
        public void prevChannel(){
            mTvState.prevChannel();
        
        public void turnUp(){
            mTvState.turnUp();
        }
        
        public void turnDown(){
            mTvState.turnDown();
        }
    }
    

    クライアントコール
    public class Client{
        public static void main(String[] args){
            TvController tvController = new TvController();
            tvController.powerOn();
            tvController.nextChannl();
            tvController.turnUp();
            tvController.powerOff();
            tvController.turnUp();
        }
    }
    

    状態パターンは,主に異なる状態における異なる表現形式の場合に用いられる.私たちが一つのものについてコメントするように、この場合はアカウントにログインしたことがあるだけで、ここにはログイン状態とログインしていない状態があり、ログイン状態であれば転送でき、ログインしていない状態ではログインページにジャンプできません.総ユーザ状態インタフェースを設定し、転送、コメントをカプセル化する方法を設定し、ログイン状態クラスと未ログイン状態クラスを設定してそれぞれの必要に応じて内部メソッドを実行し、最後の総contextクラスを設定し、必要に応じて状態クラスのメソッドを呼び出すことができます.
    ステータスモードはポリシーモードと比較してよく区別されており、状況に応じて適用可能なモードを選択します.