
- •Вступление
- •Порождающие шаблоны проектирования
- •Использование
- •Перечень порождающих шаблонов
- •Абстрактная фабрика — Абстрактная фабрика
- •Цель
- •Плюсы
- •Минусы
- •Применимость
- •Структура
- •Пример реализации
- •Builder — Строитель
- •Цель
- •Плюсы
- •Применение
- •Структура
- •Пример реализации
- •Factory method — Фабричный метод
- •Цель
- •Структура
- •Плюсы
- •Минусы
- •Пример реализации
- •Lazy initialization — Ленивая инициализация
- •Достоинства
- •Недостатки
- •Пример реализации
- •Object pool — Объектный пул
- •Применение
- •Переполнение
- •Примеры
- •Ловушки
- •Пример реализации
- •Prototype — Прототип
- •Назначение
- •Применимость
- •Структура
- •Пример реализации
- •Singleton — Одиночка
- •Цель
- •Плюсы
- •Минусы
- •Применение
- •Структура
- •Пример реализации
- •Double checked locking - Блокировка с двойной проверкой
- •Пример реализации
- •Структурные шаблоны проектирования
- •Использование
- •Перечень структурных шаблонов
- •Front Controller — Входная точка
- •Пример
- •Структура
- •Adapter — Адаптер
- •Задача
- •Способ решения
- •Участники
- •Структура
- •Следствия
- •Реализация
- •Пример реализации
- •Bridge — Мост
- •Цель
- •Структура
- •Описание
- •Использование
- •Пример реализации
- •Composite — Компоновщик
- •Цель
- •Структура
- •Пример реализации
- •Decorator — Декоратор
- •Задача
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Замечания и комментарии
- •Применение шаблона
- •Структура
- •Пример реализации
- •Facade — Фасад
- •Структура
- •Проблема
- •Решение
- •Особенности применения
- •Пример реализации
- •Flyweight — Приспособленец
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Proxy — Заместитель
- •Проблема
- •Решение
- •Структура
- •Преимущества
- •Недостатки
- •Сфера применения
- •Прокси и близкие к нему шаблоны
- •Пример реализации
- •Поведенческие шаблоны проектирования
- •Использование
- •Перечень поведенческий шаблонов
- •Chain of responsibility — Цепочка обязанностей
- •Применение
- •Сруктура
- •Пример реализации
- •Command — Команда
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Interpreter — Интерпретатор
- •Проблема
- •Решение
- •Преимущества
- •Недостатки
- •Пример
- •Структура
- •Пример реализации
- •Iterator — Итератор
- •Структура
- •Пример реализации
- •Mediator — Посредник
- •Проблема
- •Решение
- •Преимущества
- •Структура
- •Описание
- •Пример реализации
- •Memento — Хранитель
- •Применение
- •Структура
- •Описание
- •Пример реализации
- •Observer — Наблюдатель
- •Назначение
- •Структура
- •Область применения
- •Пример реализации
- •State — Состояние
- •Структура
- •Пример реализации
- •Strategy — Стратегия
- •Задача
- •Мотивы
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Полезные сведения
- •Использование
- •Сруктура
- •Пример реализации
- •Template — Шаблонный метод
- •Применимость
- •Участники
- •Сруктура
- •Пример реализации
- •Visitor — Посетитель
- •Структура
- •Описание средствами псевдокода
- •Проблема
- •Решение
- •Рекомендации
- •Преимущества
- •Недостатки
- •Пример реализации
- •Null Object (Null object)
- •Мотивация
- •Описание
- •Структура
- •Реализация
- •Пример
- •Связь с другими патернами
- •Критика и комментарии
- •Пример реализации
- •Слуга (Servant)
- •Описание
- •Структура
- •Реализаци
- •Пример реализации
- •Specification (Specification)
- •Структура
- •Пример реализации
- •Пример использования
- •Simple Policy
- •Обзор
- •Простыми словами
- •Сруктура
- •Пример реализации
- •Single-serving visitor
- •Применение
- •Пример использования
- •Плюси
- •Минусы
- •Пример реализации
- •Об авторе

Interpreter — Интерпретатор
Шаблон Интерпретатор (англ. Interpreter) — поведенческий шаблон проектирования, решающий часто встречающуюся, но подверженную изменениям, задачу. Также известен как Little (Small) Language
Проблема
Имеется часто встречающаяся, подверженная изменениям задача.
Решение
Создать интерпретатор, который решает данную задачу.
Преимущества
Грамматику становится легко расширять и изменять, реализации классов, описывающих узлы абстрактного синтаксического дерева похожи (легко кодируются). Можно легко изменять способ вычисления выражений.
Недостатки
Сопровождение грамматики с большим числом правил затруднительно.
Пример
Задача поиска строк по образцу может быть решена посредством создания интерпретатора, определяющего грамматику языка. "Клиент" строит предложение в виде абстрактного синтаксического дерева, в узлах которого находятся объекты классов "НетерминальноеВыражение" и "ТерминальноеВыражение" (рекурсивное), затем "Клиент" инициализирует контекст и вызывает операцию Разобрать(Контекст). На каждом узле типа "НетерминальноеВыражение" определяется операция Разобрать для каждого подвыражения. Для класса "ТерминальноеВыражение" операция Разобрать определяет базу рекурсии. "АбстрактноеВыражение" определяет абстрактную операцию Разобрать, общую для всех узлов в абстрактном синтаксическом дереве. "Контекст" содержит информацию, глобальную по отношению к интерпретатору.
Структура
Пример реализации using System;
using System.Collections;
namespace DoFactory.GangOfFour.Interpreter.Structural
{
/// <summary>
72
///MainApp startup class for Structural
///Interpreter Design Pattern.
///</summary>
class MainApp
{
///<summary>
///Entry point into console application.
///</summary>
static void Main()
{
Context context = new Context();
// Usually a tree
ArrayList list = new ArrayList();
//Populate 'abstract syntax tree' list.Add(new TerminalExpression()); list.Add(new NonterminalExpression()); list.Add(new TerminalExpression()); list.Add(new TerminalExpression());
//Interpret
foreach (AbstractExpression exp in list)
{
exp.Interpret(context);
}
// Wait for user Console.ReadKey();
}
}
///<summary>
///The 'Context' class
///</summary>
class Context
{
}
///<summary>
///The 'AbstractExpression' abstract class
///</summary>
abstract class AbstractExpression
{
public abstract void Interpret(Context context);
}
///<summary>
///The 'TerminalExpression' class
///</summary>
class TerminalExpression : AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("Called Terminal.Interpret()");
}
}
///<summary>
///The 'NonterminalExpression' class
///</summary>
class NonterminalExpression : AbstractExpression
{
public override void Interpret(Context context)
{
73
Console.WriteLine("Called Nonterminal.Interpret()");
}
}
}
/* Output
Called Terminal.Interpret() Called Nonterminal.Interpret() Called Terminal.Interpret() Called Terminal.Interpret()
*/
74