2012-07-13 3 views
2

У меня есть ряд функций экземпляра в классе. Существует также логическая переменная экземпляра, которая обозначает состояние объекта. Почти все функции экземпляра зависят от этого логического состояния. Их корпус выглядит какДизайн шаблона для переключения состояния для набора функций

int f() { 

    if (state) { 
     //do stuff 
    } 
    else { 
     // do other stuff 
    } 
} 

В дополнение к этому некоторые функции заменяются состоянием. Поэтому, если состояние истинно, тогда, когда пользователь вызывает f(), он фактически запускается. Но когда состояние ложно, тогда, когда пользователь вызывает f(), происходит то, что выполняется antiF().

Таким образом, некоторые функции имеют переключатели внутри, а некоторые функции полностью заменяются.

Если бы я делал это с C++, я бы, вероятно, использовал указатели на функции. Как мне это сделать с Java? Стратегия?

ответ

6

Похоже, вы хотите state pattern. Вместо того, чтобы каждый функциональный контроль за состоянием, вы тянете эти функции в состояние интерфейса и имеют отдельные реализации для каждого состояния:

public interface State { 
    void f(); 
    void g(); 
    void h(); 
} 

public class StateA : State { 
    public void f() { do something; } 
    ... 
} 

public class StateB : State { 
    public void f() { do something else; } 
    ... 
} 

Тогда вместо булевой переменной, будет поддерживать определенный State экземпляр:

State currentState = new StateA(); 
... 
currentState = new StateB(); 
+0

Допустим, StateB.g() совпадает с StateA.f(). Есть ли более простое решение, чем просто написать 'StateA.f (argument);' в теле StateB.g()? – problemofficer

+0

@problemofficer: В этом случае я бы вытащил все отдельные части функциональности в отдельный класс и просто вызывал различные функции из объектов State. Например, и 'StateB.g()', и 'StateA.f()' могут вызывать 'Foo.bar()'. – casablanca

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