Это становится немного сложнее. Я использую шаблон состояния в своем приложении для управления состояниями. Я хочу иметь один экземпляр каждого состояния в моем приложении, но я не хочу, чтобы каждый класс состояния был одноуровневым. Другой подход, который приходит мне на ум, заключается в написании класса 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;
}
}
}
Единственная плохая часть, которую я вижу здесь, - StateLocator должна знать все возможные состояния. Есть ли способ, в котором StateLocator может узнать список возможных состояний? – cppdev
Если вы хотите, чтобы ваши состояния были обнаружены, вы можете использовать шаблон наблюдателя, в котором у вас есть система публикации/подписания (например, модель события). Это все равно потребует, чтобы все состояния были обнаружены и активированы в любом случае. Вы можете использовать отражение, чтобы обнаружить их, и зарегистрировать их в модели публикации/подписки. Это, вероятно, слишком много. – Dessus
Реестр не обязательно должен знать все государства. Он может иметь абстрактное понятие о наборе уникальных состояний по ключу. поэтому .... locator.RegisterState (stateA, 1); или что-то –