Библиотека Интернет Индустрии I2R.ru |
|||
|
Паттерн "Стратегия"Паттерн "Стратегия" применяется в ситуациях, когда общую проблему нужно решить с помощью нескольких разных алгоритмов в зависимости от контекста. Выбор решения может основываться на выборе пользователя. Например, программы для работы с графикой позволяют сохранять изображения в разных графических форматах, каждый из которых имеет уникальный код. Однако процесс выбора каждого из форматов одинаков. Этот паттерн может решить проблему представления веб-приложения на различных языках или стилях. Простейшие схемы могут быть получены на основе массива переведенных слов или массива цветов для темы (theme), но сложные настройки могут требовать значительного кодирования для достижения динамического вывода. Я столкнулся с такой проблемой, когда делал интернациональные версии сайта электронной коммерции. Кроме языковых различий, в разных странах могут быть свои единицы измерения или представление формата чисел. Функция number_format может решить некоторые проблемы, однако она не поможет с денежными единицами. Американцы используют знак $ слева от суммы. Европейцы могут использовать EUR или знак евро. Для реализации паттерна "Стратегия", вы должны разработать общий интерфейс для всех алгоритмов. Затем можно делать различные реализации этого интерфейса. В PHP это можно реализовать с помощью создания общего класса, от которого будут наследоваться подклассы. В этом случае можно пользоваться преимуществом полиморфизма. Ниже приведен базовый класс localization. В нем определено два метода formatMoney и translate. Первый метод возвращает формат денежных единиц. Второй метод возвращает переведенную с английского фразу. Базовый класс определяет базовую функциональность, которая может быть расширена в подклассах. <?php //Strategy super class class localization { function formatMoney($sum) { number_format($sum); } function translate($phrase) { return($phrase); } } ?> Ниже приведен английский подкласс класса localization. Этот класс заботится о том, чтобы ставить знак "-" слева от знака $. Метод translate не переобозначается, потому что предполагается, что все фразы будут вводится на английском. <?php include_once('localization.php'); class english extends localization { var $word; function formatMoney($sum) { $text = ""; //negative signs precede dollar signs if($sum < 0) { $text .= "-"; $sum = abs($sum); } $text .= "$" . number_format($sum, 2, '.', ','); return($text); } } ?> Ниже приведен немецкий подкласс класса localization. Этот класс использует промежутки для отделения тысяч и запятые для разделения десятичных дробей. Кроме того, этот подкласс простенько переобозначает метод translate, который обрабатывает только yes и no. В реальном приложении надо использовать базу данных для этих целей. <?php include_once('localization.php'); class german extends localization { var $word; function formatMoney($sum) { $text = "DM " . number_format($sum, 2, ',', '.'); return($text); } function translate($phrase) { if($phrase == 'yes') { return('ja'); } if($phrase == 'no') { return('nein'); } return($phrase); } } ?> В заключение приведен пример использования подклассов. Скрипт может выбирать подкласс на основе пользовательских предпочтений или других источников, например HTTP-заголовка или доменного имени. В данной реализации подклассы хранятся в файлах с такими же именами. Обратите внимание, что для выбора подкласса используется переменная $language. <?php //initialize $language = 'english'; include($language . '.php'); $local = new $language; //test formatting print($local->formatMoney(12345678) . "<br>\n"); print($local->translate('yes') . "<br>\n"); ?> Одно из преимуществ паттерна "Стратегия" - это устранения кучи сравнений. Представьте себе, что один скрипт содержит весь функционал для форматирования чисел для любого языка. В нем обязательно будет switch или много if-else. Кроме того, потребуется обрабатывать больше кода, чем необходимо для конкретной страницы. Данный паттерн определяет удобный интерфейс для расширения. Вы можете начать всего с одного модуля локализации, а затем уже можно с помощью native speakers легко присоединить любые другие языковые модули. Это можно применять не только для локализации, таким способом можно решить любую проблему, которая требует различных алгоритмов в зависимости от контекста. |
|
2000-2008 г. Все авторские права соблюдены. |
|