状態

2017-02-23 18 views
0

を変更する際に、追加のコンテンツを持っているための適切な方法は何である私は、このようなクラスを持っている:状態

public class Machine { 
    enum State { 
     STARTED, STOPPED 
    } 

    private State state; 
    private String whyIsItStopped; // only used in STOPPED state 

    ... 
} 

私はこれを行うための適切な方法であるのだろうか。私はこれともっと複雑なクラスの方法を持っており、私がこれを行うと混乱するようです。

私のアーキテクチャに問題があります。何かアドバイスをいただけますか? /ステートパターンが同じメソッドの動作を変更するには良いようだが、それはadditionnalフィールドに奇妙である

public interface State { 

    public String whyIsItStopped(); 

    public class Started implements State { 
     @Override 
     public String whyIsItStopped() { 
      return null; 
     } 
    } 

    public class Stopped implements State { 
     private final String reason; 

     public Stopped(String reason) { 
      this.reason = reason; 
     } 

     @Override 
     public String whyIsItStopped() { 
      return reason; 
     } 
    } 
} 

public class Machine { 

    private State state = new State.Started(); 

    public String whyIsItStopped(){ 
     state.whyIsItStopped(); 
    } 

    // setState etc ... 
} 

:私のようなほぼ溶液で到着した状態パターンを使用して

UPDATE

データ。

問題は、実際には同じオブジェクトではなく、多形性は本当に有用ではないということです。私はマシンが(instanceofはの方法として)そのコンテンツを取得する前に停止されたかどうかをテストする必要が

if (machine.isStopped()){ 
    println(machine.whyIsItStopped()); 
} 

もう一つの方法は、唯一の停止状態

public interface State { 

    public class Started implements State {} 

    public class Stopped implements State { 
     private final String reason; 

     public String whyIsItStopped() { 
      return reason; 
     } 
    } 
} 

にゲッターを設定することが可能であり、メッセージを取得する:

if (machine.isStopped()){ 
    println(((State.Stopped)machine.getState()).whyIsItStopped()); 
} 
// Yeah that's not really beautiful 

どちらかが古くなっているか、使用率が異常です。

他の解決方法がありますか?

+0

アンデレスの答えが上です。多態性を使用して**状態マシン**を実装する - 抽象ベース。州固有のサブクラスが含まれます。あなたは手動でこの方法であなたのfsmを「ハードコードしない」** **です。 – GhostCat

+0

各クラスの特定のメソッドではなく、パターンに記述されているhandleメソッドを使用します。 – Andres

答えて

3

State Patternの問題は明らかです。既存のコードを変更することなく、新しい状態で拡張できるソリューションを実装することができます。

ステートパターンは、オブジェクト指向の方法でステートマシンを実装するビヘイビアソフトウェア設計パターンです。状態 パターンでは、 状態パターン・インターフェースの派生クラスとして を実装し、 パターンのスーパークラスによって定義されたメソッドを呼び出すことによって状態遷移を実装することによって、状態マシンが実装されます。