Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ооп2.docx
Скачиваний:
8
Добавлен:
22.09.2019
Размер:
587.13 Кб
Скачать
  1. Придумайте пример конкретной задачи, когда целесообразно было бы использовать паттерн «Состояние». Изобразите диаграмму классов для данного примера.

Состояние - паттерн поведения объектов.

Назначение:

Позволяет объекту варьировать свое поведение в зависимости от внутреннего состояния. Извне создается впечатление, что изменился класс объекта.

Рассмотрим класс TCPConnection, с помощью которого представлено сетевое соединение. Объект этого класса может находиться в одном из нескольких состояний: Established (установлено), Listening (прослушивание), Closed (закрыто). Когда объект TCPConnection получает запросы от других объектов, то в зависимости от текущего состояния он отвечает по-разному. Например, ответ на запрос Open (открыть) зависит от того, находится ли соединение в состоянии Closed или Established. Паттерн состояние описывает, каким образом объект TCPConnection может вести себя по-разному, находясь в различных состояниях. Основная идея этого паттерна заключается в том, чтобы ввести абстрактный класс TCPState для представления различных состояний соединения. Этот класс объявляет интерфейс, общий для всех классов, описывающих различные рабочие

состояния. В подклассах TCPState реализовано поведение, специфичное для конкретного состояния. Например, в классах TCPEstablished и TCPClosed реализовано поведение, характерное для состояний Established и Closed соответственно.

Класс TCPConnection хранит у себя объект состояния (экземпляр некоторого подкласса TCPState), представляющий текущее состояние соединения, и делегирует все зависящие от состояния запросы этому объекту. TCPConnection использует свой экземпляр подкласса TCPState для выполнения операций, свойственных только данному состоянию соединения.

При каждом изменении состояния соединения TCPConnection изменяет свой объект-состояние. Например, когда установленное соединение закрывается, TCPConnection заменяет экземпляр класса TCPEstablished экземпляром TCPCIosed.

Если по-русски, то на диаграмме видно, что существует общий интерфейс TCPState, для него всегда определены три метода (open, close, acknowledge). Одного из потомков этого класса (TCPEstablished, TCPListen, TCPClosed) содержит класс TCPConnection. Какого из них – неизвестно, в зависимости от того, что сейчас делает TCPConnection, если прослушивает соединение – TCPListen, если закрыто – то TCPClosed, если соединение установлено – то TCPEstablished. TCPConnection использует их методы, не зная какой конкретно класс использует. Преимущество в том, что изменение состояния учитывается только единожды, а вся логика разделена в различных TCPState

  1. Опишите на языке c# несколько классов/интерфейсов, в совокупности реализующих паттерн «Стратегия».

КОД:

/* интерфейс и два класса стратегий */

abstract class Strategy

{

public abstract void AlgorithmInterface();

}

class ConcreteStrategyA : Strategy

{

public override void AlgorithmInterface()

{

Console.WriteLine("ConcreteStrategy A");

}

}

class ConcreteStrategyB : Strategy

{

public override void AlgorithmInterface()

{

Console.WriteLine("ConcreteStrategy B");

}

}

/* объект, использующий стратегии */

class Context

{

private Strategy _strategy;

public Context(Strategy strategy)

{

this._strategy = strategy;

}

public void ContextInterface()

{

_strategy.AlgorithmInterface();

}

}

//main program

class Program

{

static void Main(string[] args)

{

Context c = new Context(new ConcreteStrategyA());

c.ContextInterface();

c = new Context(new ConcreteStrategyB());

c.ContextInterface();

Console.ReadLine();

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]