Стратегический режим программирования в режиме Delphi
Лю Йи
1.1 Объяснение режима
Цель шаблона «Стратегия» — определить набор алгоритмов и инкапсулировать каждый алгоритм в независимый класс с общим интерфейсом, чтобы их можно было заменять друг другом. Шаблон «Стратегия» позволяет изменять алгоритм независимо от того, использует ли его клиент. Чтобы понять мотивацию и значение использования шаблона стратегии, нам нужно начать с интересного примера. В системе управления материальными потоками исходящие и входящие модули являются основными частями системы (в качестве примера для анализа мы возьмем исходящие материалы). Программисты, не имеющие опыта объектно-ориентированного программирования, часто помещают всю логику исходящего заказа на клиент (интерфейс заказа на выходе) и используют на клиенте операторы условного перехода, чтобы определить, является ли тип исходящего заказа комплектованием. заимствовать материалы или сообщать об убытках, чтобы выбрать различные методы исходящих расчетов, как показано на рисунке 1-1. В результате код клиента становится сложным и трудным в сопровождении. Например: когда вам нужно добавить новый тип заказа на перемещение со склада, вам необходимо изменить условия оценки, перекомпилировать и опубликовать клиента. По мере усложнения ситуации будет появляться все больше условных ветвей и добавляться все больше и больше программных кодов. Это сделает клиент больше и сложнее в обслуживании, а также увеличится возможность взаимного влияния и ошибок. . Рисунок 1-1. Исходящий модуль, разработанный на основе процессно-ориентированного мышления. При анализе с использованием объектно-ориентированного мышления список комплектации, список заимствований и отчет о потерях можно рассматривать как производные классы исходящей записки, как показано на рисунке 1-. 2 Шоу. Таким образом, исходящий документ служит базовым классом документа, обеспечивающим общий интерфейс для документов, а наследование используется для реализации различного исходящего поведения в подклассах. На самом деле здесь используется важная концепция объектно-ориентированного подхода: полиморфизм. Но у этой конструкции все еще есть недостаток: окружающая среда и поведение тесно связаны друг с другом. Другими словами, документ и конкретный исходящий алгоритм тесно связаны. Сильная связь не позволяет им развиваться независимо, ограничивая возможность повторного использования и масштабируемости. На рис. 1-3 показан исходящий модуль, переработанный с использованием шаблона стратегии. Объект исходящего документа ссылается на объект исходящей политики через объект исходящей операции (т. е. контекст в режиме стратегии). Различные конкретные исходящие стратегии реализуются производными классами исходящего класса стратегии. Исходящий документ может предоставлять метод исходящего расчета и интерфейс отображения документа по исходящей операции и стилю документа соответственно. Таким образом, режим стратегии отделяет исходящее поведение от среды исходящего документа, и увеличение, уменьшение или изменение исходящего алгоритма не повлияет на среду и клиента. Рис. 1-2 Исходящий модуль, разработанный на основе объектно-ориентированного мышления. Рис. 1-3 Исходящий модуль, разработанный на основе шаблонного мышления. Преимущество стратегического шаблона заключается в разделении алгоритма и среды, и они могут развиваться независимо. Чтобы лучше проиллюстрировать преимущества разделения алгоритмов и сред, мы могли бы также взглянуть на конструкцию, показанную на рис. 1-4. В этом проекте нет концепции исходящих и входящих модулей, поскольку я абстрагирую все исходящие/входящие документы и динамически комбинирую интерфейс и поведение документов во время выполнения. С помощью класса исходящих/входящих операций можно поддерживать, запрашивать и настраивать различные классы поведения. Абстрагированное исходящее/входящее поведение инкапсулирует соответствующий алгоритм в форме класса стратегии для выполнения операций с различными типами входящих и исходящих документов. Это, очевидно, улучшает возможности повторного использования и масштабируемости системы и снижает сложность обслуживания. Рис. 1-4. Преимущество шаблона стратегии заключается в разделении алгоритма и среды. Они могут развиваться независимо. Видно, что шаблон стратегии подходит для следующих ситуаций: · Когда существует разница между многими связанными классами. только в своем поведении. Паттерн «Стратегия» позволяет объекту динамически выбирать одно поведение из многих. · Когда существует несколько альтернативных алгоритмов достижения цели, например те, которые вы определяете на основе разных компромиссов (т. е. применения разных стратегий). Эти конкретные алгоритмы могут быть инкапсулированы в производные классы класса абстрактных алгоритмов и использовать унифицированный интерфейс класса абстрактных алгоритмов. Благодаря полиморфизму клиент может выбрать любой конкретный алгоритм, если он содержит объект абстрактного класса алгоритма. · Когда алгоритм использует данные, недоступные клиенту. Использование шаблона «Стратегия» позволяет избежать раскрытия сложных структур данных, связанных с алгоритмом. Фактически клиенту не обязательно знать знания и данные, связанные с алгоритмом. · Когда определение класса имеет множество вариантов поведения и для определения выбора этих вариантов поведения используется несколько условных операторов. Шаблон стратегии может передавать это поведение соответствующим конкретным классам стратегии, тем самым избегая множественных условных выборов, которые трудно поддерживать, и воплощая идеи объектно-ориентированного программирования.
1.2 Структура и использование
Структура шаблона стратегии показана на рисунке 1-5 и включает в себя следующих участников: · Абстрактная стратегия (TStrategy) — объявляет общий интерфейс для всех поддерживаемых алгоритмов. TContext использует этот интерфейс для вызова алгоритмов, определенных и инкапсулированных TConcreteStrategy. · Конкретная стратегия (TConcreteStrategy) – инкапсулирует определенные алгоритмы или поведение. Реализовать интерфейс TStrategy. · Контекст (TContext) – содержит ссылку на TStrategy. Вызовите интерфейс TStrategy для динамической настройки определенных алгоритмов или поведения. Рисунок 1-5 Структура шаблона стратегии В шаблоне стратегии выбранный алгоритм реализуется посредством взаимодействия TStrategy и TContext. При вызове алгоритма TContext может передать все данные, необходимые алгоритму, в TStrategy. Альтернативно, TContext может передать себя в качестве параметра операции TStrategy. Когда TContext пересылает запрос клиента в свой TStrategy, клиент обычно создает и передает объект TConcreteStrategy в TContext таким образом, клиент взаимодействует только с TContext; Обычно существует ряд классов TConcreteStrategy, из которых клиенты могут выбирать. -------------------------------------------------- ---------------------------------------
Дополнительные статьи по теме и примеры исходных кодов программ можно загрузить с сайта автора: http://www.liu-yi.net.