На главную

Библиотека Интернет Индустрии I2R.ru

Rambler's Top100

Малобюджетные сайты...

Продвижение веб-сайта...

Контент и авторское право...

Забобрить эту страницу! Забобрить! Блог Библиотека Сайтостроительства на toodoo
  Поиск:   
Рассылки для занятых...»
I2R » Сайтостроительство » Web-программирование

Паттерн "Стратегия"

Паттерн "Стратегия" применяется в ситуациях, когда общую проблему нужно решить с помощью нескольких разных алгоритмов в зависимости от контекста.

Выбор решения может основываться на выборе пользователя. Например, программы для работы с графикой позволяют сохранять изображения в разных графических форматах, каждый из которых имеет уникальный код. Однако процесс выбора каждого из форматов одинаков.

Этот паттерн может решить проблему представления веб-приложения на различных языках или стилях. Простейшие схемы могут быть получены на основе массива переведенных слов или массива цветов для темы (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 легко присоединить любые другие языковые модули. Это можно применять не только для локализации, таким способом можно решить любую проблему, которая требует различных алгоритмов в зависимости от контекста.

Leon Atkinson / Zend
Перевод: Михаил Дубаков
Web-анатомия

Спонсор раздела

Рассылки Subscribe.ru:

Библиотека сайтостроительства - новости, статьи, обзоры
Дискуссионный лист для web-разработчиков
Подписка на MailList.Ru
Автор: NunDesign
Другие разделы
Оптимизация сайтов
Web-студии
» Новое в разделе
Web-дизайн
Web-программирование
Интернет-реклама
Раскрутка сайта
Web-графика
Flash
Adobe Photoshop
Рассылка
Инструменты вебмастера
Контент для сайта
HTML/DHTML
Управление web-проектами
CSS
I2R-Журналы
I2R Business
I2R Web Creation
I2R Computer
рассылки библиотеки +
И2Р Программы
Всё о Windows
Программирование
Софт
Мир Linux
Галерея Попова
Каталог I2R
Партнеры
Amicus Studio
NunDesign
Горящие путевки, идеи путешествийMegaTIS.Ru

2000-2008 г.   
Все авторские права соблюдены.
Rambler's Top100