ステータスモード-if-elseの煩雑な構造を省く

5107 ワード

状態モード定義機能インタフェース、異なる状態での機能実装、状態インタフェースの定義、controllerでのsetStateによる後続の異なる動作の生成を一言で説明する.
機能インタフェース
public interface Function {

    void drive();

    void run();

    void back();

}

機能実装インタフェース1
public class OffLineState implements Function {
    @Override
    public void drive() {
        System.out.print("    drive");
    }

    @Override
    public void run() {
        System.out.print("    run");
    }

    @Override
    public void back() {
        System.out.print("    back");
    }
}

機能実装インタフェース2
public class OnLineState implements Function {
    @Override
    public void drive() {
        System.out.print("   drive");
    }

    @Override
    public void run() {
        System.out.print("   run");
    }

    @Override
    public void back() {
        System.out.print("   back");
    }
}

ステータスインタフェース
public interface State {

    void offLine();
    void onLine();
}

Controller
public class StateController implements State {

    Function func;

    public void setstate(Function c) {
        this.func = c;
    }


    @Override
    public void offLine() {
        //       
        setstate(new OffLineState());
    }

    @Override
    public void onLine() {
         //       
        setstate(new OnLineState());
    }

    public void drive() {
        func.drive();
    }

    public void run() {
        func.run();
    }

    public void back() {
        func.back();
    }
}

cliet呼び出し
/**
     *       :           ,             
     */
    public void testState() {
        StateController controller = new StateController();
        //    
        controller.onLine();
        //     if-else   
        controller.run();
        controller.drive();
        controller.back();

    }

利点:Stateモードは、特定の状態に関連するすべての動作を1つの状態オブジェクトに配置し、特定の状態に関連するコードを組織するより良い方法を提供し、煩雑な状態判断を構造が明確な状態ファミリーに変換し、コードの膨張を避ける同僚でも拡張性とメンテナンス性を保証します.
欠点:システムクラスとオブジェクトの個数を増やしました.