「Patternの設計」ステータス・アレイ


ステータスモード

  • 動作モード

  • ルールのセットに基づいてオブジェクトの状態を変更し、オブジェクトが実行できる動作を変更するモード.

  • オブジェクトの特定のステータスをクラスとして宣言し、そのステータスでクラスで実行できる動作をメソッドとして定義します.
  • こうぞう


  • State
  • システムのすべての状態の汎用インタフェース
  • このインタフェースの実体化された任意のステータスクラスは、
  • を使用する既存のステータスクラスに置き換えることができる.
  • State1, State2, State3
  • Contextオブジェクト要求のタスクは、
  • を独自に実行する.
  • ほとんどの場合、以下の状態を決定してContextオブジェクトに状態変更を要求する役割も実行される:
  • .
  • Context
  • 状態、
  • には、現在のシステム状態を示す状態変数(state)と、実際のシステム状態を構成する複数の変数
  • とがある.
  • 各ステータスクラスは、ステータスの変更を要求することによってステータスを変更する方法(setState)を提供します.
  • Context要素のクラスを実装する要求メソッドは、実際の動作を実行するのではなく、動作実行をその状態オブジェクトに委任する.
  • インプリメンテーション


    蛍光灯の作成

    State.class
    public interface State{
        void on_button_pushed(Light light);
        void off_button_pushed(Light light);
    }
  • 蛍光灯開閉機能宣言
  • ON.class
    public class ON implements State{
        private static ON on = new ON(); // ON 클래스의 인스턴스로 초기화됨
        private ON() { }
    
        public static ON getInstance() { // 초기화된 ON 클래스의 인스턴스를 반환함
            return on;
        }
    
        public void on_button_pushed(Light light){ // ON 상태일 때 On 버튼을 눌러도 변화 없음
            System.out.println("반응 없음");
        }
    
        public void off_button_pushed(Light light){
            light.setState(OFF.getInstance());
            System.out.println("Light Off!");
        }
    }
    OFF.class
    public class OFF implements State{
        private static OFF off = new OFF();
        private OFF() { }
    
        public static OFF getInstance() { 
            return off;
        }
    
        public void on_button_pushed(Light light){ 
            light.setState(ON.getInstance());
            System.out.println("Light On!");
        }
    
        public void off_button_pushed(Light light){ 
            System.out.println("반응 없음");
        }
    }
    -蛍光灯の状態に特化した機能を実施する
    Light.class
    public class Light{
        private State state;
    
        public Light(){
            state = OFF.getInstance();
        }
    
        public void setState(State state){
            this.state = state;
        }
    
        public void on_button_pushed(){
            state.on_button_pushed(this);
        }
    
        public void off_button_pushed(){
            state.off_button_pushed(this);
        }
    }
  • 目的の機能を呼び出す
  • 初期値OFF
  • に設定
    Main.class
          public static void main(String[] args) {
            Light light = new Light();
            light.on_button_pushed();
            light.on_button_pushed();
            light.off_button_pushed();
            light.off_button_pushed();
        }
    実行結果
    >>>Light On!
    >>>반응 없음
    >>>Light Off!
    >>>반응 없음

    メリットとデメリット

  • の利点
    1つのオブジェクトに対して複数のアクションを実行する必要がある場合には、状態オブジェクトのみを修正することにより、アクション
  • の追加、削除および修正が簡略化される.
  • 状態モードは、オブジェクト状態に基づいて生成する条件文(if/else,switch)を低減し、コードを簡略化し、可読性を向上させる
  • .
  • の欠点
  • の状態による条件文の代わりに状態オブジェクトを増やすことで、管理するクラス数は
  • 増加する.
    関連項目:
  • State Pattern(ステータスモード)
  • デザインモードステータスモード
  • デザインモードステータスモード