2010-07-02 2 views
3

Во-первых, может ли кто-нибудь объяснить, как объект состояния может использоваться совместно, если объект состояния не имеет переменных экземпляра?Проблемы с реализацией состояния State State State GOF

Этот текст взят из GOF, стр 308, пункт 3 (последствия раздела):

состояние объекта может быть общим. Если объекты состояния не имеют экземпляров variabkes, то есть состояние, которое они представляют , кодируется целиком в своем типе - тогда контексты могут совместно использовать объект состояния . Когда состояния разделены в таким образом, они по существу являются мухи.

Может кто-нибудь объяснить этот текст?

Во-вторых, каковы подходы к решению о государственном переходе? Я имею в виду решение о том, какое следующее государство будет распространяться?

Пожалуйста, помогите. Спасибо.

+0

Можете ли вы объяснить свой второй вопрос. Как правило, государственная система не принимает решения о том, какое состояние будет изменено - оно выведено из-за пределов государственной системы. Все, что он делает, это определить состояния и переходы между ними. –

+0

Кстати, это не имеет особого отношения к C++. –

+0

Как вы все знаете, шаблон состояния не определяет метод перехода состояния. Поэтому я задаюсь вопросом, каков подход кодирования перехода состояния с шаблоном состояния? Пожалуйста, помогите. Спасибо. – peterwkc

ответ

2

В государственном образце у вас есть представляют состояние объекта с использованием состояний-объектов. Эти государственные объекты представляют определенное состояние, но они не имеют любое собственное изменяемое собственное состояние. Это означает, что они никогда не меняются. Поэтому любое количество объектов может одновременно использовать один и тот же объект состояния (даже из разных потоков). Если состояние-объект имеет изменяемое состояние, другим объектам придется беспокоиться об изменении своего объекта состояния из другого места.

Использование экземпляра одного объекта многими другими может рассматриваться как экземпляр flyweight-pattern.

Что касается второй части вашего вопроса, то вот пример:

class SomeStateMachine; 

class AbstractState { 
    // abstract baseclass for all state-classes 
    void input(const std::string & data, SomeStateMachine & caller) = 0; 
} 

class FinalState : public AbstractState { 
    FinalState * getInstance(); // always returns same instance 
} 

class InitialState : public AbstractState { 
public: 
    InitialState * getInstance(); // always returns same instance 
    void input(const std::string & data, SomeStateMachine & caller) { 
     std::cout << data << std::endl; 
     caller.m_State = FinalState::getInstance(); 
    } 
} 

class SomeStateMachine { 
public: 
    SomeStateMachine() : m_State(InitialState::getInstance()) 
    void input(const std::string & data) { 
     m_State->input(data, *this); 
    } 
private: 
    friend class InitialState; 
    AbstractState * m_State; 
}; 

Таким образом, вы в основном передать ссылку на объект вызова для каждого метода вашего государства-объекта. Таким образом, объект состояния может изменять состояние вызывающего абонента, когда это необходимо. Этот пример может быть не очень красивым, но я надеюсь, что вы поняли эту идею.

+0

Использование экземпляра одного объекта многими другими может рассматриваться как экземпляр мухи-паттерна. Я этого не понимаю. – peterwkc

+0

Затем вы должны прочитать шаблон flywheigt, потому что это то, о чем все. –

+0

Я понимаю мухи, но я не знаю, как это связано с государственным шаблоном. – peterwkc

2

Абзац в основном говорит о том, что вы кодируете свои состояния как отдельные классы - тогда тип экземпляра является «состоянием», а классам не нужны переменные экземпляра, потому что их тип кодирует всю необходимую вам информацию.

Например, я хочу иметь три состояния: «Открыть», «Актив» и «Закрыто». Я мог бы определить следующие классы:

abstract class State {}; 

class Open extends State { 

    public Open() {} 

} 

class Active extends State { 

    public Active() {} 

} 

class Closed extends State { 

    public Closed() {} 

} 

-

Другого варианта - я подозреваю, что это сочетание с балансиром быть намекает в тексте GOF бы создать государственный класс, куча из статических членов (по одному для каждого состояния), которые затем могут быть разделены -

public class State { 

    private string name; 

    private State(String name) { 
    this.name = name; 
    } 

    public final static State OPEN = new State("Open"); 
    public final static State ACTIVE = new State("Active"); 
    public final static State CLOSED = new State("Closed"); 

} 

мне пришлось копаться, чтобы напомнить себе о том, как все эти вещи работали в деталях. Кераевский имеет хорошее описание этого (я сильно заимствован из одного из своих примеров выше!) И того, как переходы состояния могут обрабатываться путем подклассификации из класса состояний, для создания классов, управляющих каждым переходом. Смотрите "Рефакторинг с использованием шаблонов" (ISBN: 0321213351)

EDIT (2): Его веб-сайт имеет диаграмму классов для его примера - http://www.industriallogic.com/xp/refactoring/alteringConditionalsWithState.html

alt text

+0

Спасибо за ваше объяснение. Как насчет объекта общего состояния? – peterwkc

+0

Интересно, как и в какой ситуации мы можем комбинировать мухи с шаблоном состояния. – peterwkc

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