простое объяснение государственного шаблона проектирования программного обеспечения. - PullRequest
0 голосов
/ 08 февраля 2012

Я понимаю идею изменения состояний, но я не понимаю, что это значит для википедии, когда говорится, что этот шаблон позволяет объекту

частично изменять свой тип во время выполнения. Как именноэто сделано?Вики немного размыты по понятиям.

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Основная идея шаблона состояния заключается в том, что в некотором классе Context определенное поведение определено в другом объекте.

public class Context
{
    ....

    public void Request()
    {
       _state.Handle(this);
    }
}

Поведение Request зависит от текущего значения _state.State - это то, что может измениться во время выполнения, и для пользователя Context поведение Context изменится.

В следующем коде текущий Context передается в State, и State может изменить Context.

    /// <summary>
    /// The 'State' abstract class
    /// </summary>
    abstract class State
    {
        public abstract void Handle(Context context);
    }

    /// <summary>
    /// A 'ConcreteState' class
    /// </summary>
    class ConcreteStateA : State
    {
        public override void Handle(Context context)
        {
            context.State = new ConcreteStateB();
        }
    }

    /// <summary>
    /// A 'ConcreteState' class
    /// </summary>
    class ConcreteStateB : State
    {
        public override void Handle(Context context)
        {
            context.State = new ConcreteStateA();
        }
    }

Этот пример взят из справочная , которая содержит описание наиболее популярных шаблонов дизайна.

0 голосов
/ 08 февраля 2012

Я думаю, что под этим утверждением подразумевается, что вы можете иметь один объект класса Cursor (заимствовать пример из Википедии) и использовать его как инструмент.

Однако внутреннее состояние курсораОбъект может быть либо PenTool, либо SelectionTool, и он может переключаться вперед и назад, не затрагивая объект Cursor.Таким образом, по сути, объект Cursor, когда используется как инструмент, «меняет свой тип» с PenTool на SelectionTool и обратно, не затрагивая код, использующий объект Cursor.

...