私は車に関する問題を説明しようとします。私はAbstractCarを持っており、私の図書館のユーザー(開発者)は多くのコンクリート車を作成します。このAbstractCarには状態があり、この状態はライブラリの正しい作業にとって非常に重要です!車だけがその状態を制御することができます(ドライバなどはありません)。メソッドの開始/停止は、メソッドの開始時と終了時に状態が変化します。また、すべての車はインターフェースカーを実装する必要があります。Java:状態と継承を扱うためのデザインパターン
public enum State{
STARTING, STARTED, STOPPING, STOPPED
}
public interface Car{
public void start();
public void stop();
public State getState();
}
私は2つの変種を試しました。
バリアント図書館の利用者が状態を変更するために覚えておく必要がありますバリアント1で1
public abstract class AbstractCar implements Car{
private State state;
public void setState(State state){...}
public State getState(){...}
}
public class ConcreteCar extends AbstractCar{
@Override
public void start(){
setState(stateK);
...
setState(stateN);
}
@Override
public void stop(){
setState(stateR);
...
setState(stateO);
}
}
。彼がそれをやめたら、コードにバグがあります。それは彼のコントロールの外に既にあるので、ユーザは状態を忘れることはできませんが、私は多くの州や多くのメソッドを持っている場合、彼らはこれを変更することができるバリアント2では
バリアント2
public abstract class AbstractCar implements Car{
private State state;
protected void doOnStart(){ }
protected void doOnStop(){ }
public final void start(){
state=...;
doOnStart();
state=...;
}
public final void stop(){
state=...;
doOnStop();
state=...;
}
}
public class ConcreteCar extends AbstractCar{
@Override
protected void doOnStart(){
....
}
@Override
protected void doOnStop(){
...
}
}
非常に良い方法ではありません。
どのようなパターンや技術にこのような問題を解決する方法をアドバイスできますか?
バリアント2は、テンプレートメソッドパターンです:https://en.wikipedia.org/wiki/Template_method_pattern –
@ cricket_007私は同じように、状態パターンについて読んだことがあります私はそれが状態に応じて行動を変えることを可能にすることを正しく理解している。しかし、私は違う振る舞いは必要ありません。私は状態を制御する必要があります。 –
あなたのpsudeocodeから、開始、開始、停止、停止状態のようですか? –