2012-01-18 3 views
1

Это становится немного сложнее. Я использую шаблон состояния в своем приложении для управления состояниями. Я хочу иметь один экземпляр каждого состояния в моем приложении, но я не хочу, чтобы каждый класс состояния был одноуровневым. Другой подход, который приходит мне на ум, заключается в написании класса StateLocator. StateLocator может быть одноточечным и может содержать экземпляры всех состояний. Расскажите, пожалуйста, о том, является ли StateLocator хорошим решением или есть какие-либо другие решения, в которых я все еще могу иметь только один экземпляр государства и потенциально избегать одиночных игр.Государственный дизайн, но избегая одиночных игр

Любая помощь приветствуется. например

public interface TestState { 

    public void onTest(); 
    public void onApprove() 

} 

class StateA implements TestState { 
    public void onTest() { 
    } 
    public void onApprove() { 
    } 
} 

class StateB implements TestState { 
    public void onTest() { 
    } 
    public void onApprove() { 
    } 
} 

class StateLocator { 

    private StateA mStateA; 
    private StateB mStateB; 

    StateLocator() { 
     mStateA = new StateA(); 
     mStateB = new StateB(); 
    } 

    public TestState getState(int stateType) { 

     if(stateType == 1) { 
      return mStateA; 
     } else { 
     return mStateB; 
     } 
    } 
} 

ответ

2

StateLocator, в том, как вы используете его, это «Регистр» образец

http://martinfowler.com/eaaCatalog/registry.html

ничего не зная о вашем дизайне, это хороший способ избежать одиночек. Реестр может быть одноэлементным (необязательно обязательно).

+0

Единственная плохая часть, которую я вижу здесь, - StateLocator должна знать все возможные состояния. Есть ли способ, в котором StateLocator может узнать список возможных состояний? – cppdev

+0

Если вы хотите, чтобы ваши состояния были обнаружены, вы можете использовать шаблон наблюдателя, в котором у вас есть система публикации/подписания (например, модель события). Это все равно потребует, чтобы все состояния были обнаружены и активированы в любом случае. Вы можете использовать отражение, чтобы обнаружить их, и зарегистрировать их в модели публикации/подписки. Это, вероятно, слишком много. – Dessus

+1

Реестр не обязательно должен знать все государства. Он может иметь абстрактное понятие о наборе уникальных состояний по ключу. поэтому .... locator.RegisterState (stateA, 1); или что-то –

Смежные вопросы