[Примечание: я Java-парень, поэтому моя реализация ниже на Java - она должна быть очень похожа на C # или любой другой язык, который вы хотите использовать]
Роб указывает на проблему с вышеприведенным решением - оно действительно не поддается обслуживанию.
Это также невероятно многословно (обычно шаблон состояния GoF ...).
Иногда шаблон State не совсем то, что вы должны использовать.
Как насчет вывернуть проблему наизнанку и позволить данным управлять ею?
Посмотрите на это как «для каких состояний должен отображаться X?»
Попробуйте что-то вроде следующего:
- создать перечисление, представляющее ваши состояния
- создать EnumSet для каждого элемента управления (они очень эффективны)
- в каждом EnumSet, добавьте состояния, для которых этот элемент управления должен быть видимым
- при изменении состояния проверьте видимость каждого элемента управления
Схематичная реализация (не скомпилирована / не протестирована)
public enum MyStates {State1, State2, State3...}
public class VisibilityManager {
private Map<Component, Set<MyStates>> managedComponents =
new HashMap<Component, Set<MyStates>>();
private Component component;
public void setVisibility(Component component, MyStates... states) {
Set<MyStates> visibleStates = EnumSet.of(states);
managedComponents.put(component, states);
}
public void update(MyStates currentState) {
for (Map.Entry<Component, Set<MyStates>> e : managedComponents.entrySet())
e.getKey().setVisible(e.getValue().contains(currentState));
}
}
// then in your GUI setup
VisibilityManager v = new VisibilityManager();
v.setVisibility(comp1, MyStates.State1, MyStates.State2);
v.setVisibility(comp1, MyStates.State3);
v.setVisibility(comp1, MyStates.State1, MyStates.State3, MyStates.State5);
...
// and when you change the state
v.update(newState);
Надеюсь, это поможет!