Strategy Pattern. Просто о простом

от автора

Привет всем! Работаю я в одной компании по написанию различных web систем, к нам довольно часто приходят на собеседование, и оказалось, что довольно трудно найти человека которые знает что такое паттерны, а еще сложнее того, кто умеет ими пользоваться. А ведь паттерны, это ничто иное как решение тривиальных задач. По идеи это то, что начинающий программист должен сразу изучить и понять. В интернете довольно много статей на эту тему с примерами, но не все понятны и прозрачны. Я хотел бы рассказать о них по своему. В каждом посте я буду рассказывать об одном паттерне. Для кого эта статья, для тех кто знает что такое ООП (наследование, полиморфизм, инкапсуляция и т.д), также знает какие виды паттернов бывают. Я буду рассматривать их в произвольном порядке. Сегодня хотелось бы поговорить о Strategy Pattern.

Основная задача:
Главная идея в том, что бы у вас на каждый случай был класс. Ниже, мы рассмотрим пример с валидацией юзера. То есть, для валидации каждого поля мы создадим отдельный класс. Немножко громозко для случая с валидацией, но для примера, самое оно. Ну вот получили кучу классов, и что??? Правильно у нас еще будет и связующий абстрактный класс. Если говорить совсем просто то Strategy Pattern — это полиморфизм в чистом виде). Итак, что нам надо:

1. Один абстрактный класс, содержащий одинаковые для каждого случая методы
2. По классу на каждый случай, которые наследуют абстрактный класс и предназначены для конкретного случая
Классы буду содержать реализацию поставленной задачи.

Абстрактный класс:

 <?php class Validations {  public $error;      // конструктор      function Validations ()     {                 $this->validate();     }      // абстрактный метод, который вызывается здесь в конструкторе, но будет определен в дочерних классах.    abstract  function validate() {}     function setError ($msg)     {         $this->errorMsg[]=$msg;     }  function getError ()     {         return array_pop($this->errorMsg);     }           // проверяет вилидно ли наше значение     function isValid ()     {         if ( isset ($this->errorMsg) )         {             return false;         }         else         {             return true;         }     }       } ?>  

Ну все готово, теперь клепаем классики наследники на каждый случай, приставим что случая всего 2, проверка пароля и логина

Класс-наследник для проверки логина

 <?php class ValidateLogin extends Validations {           private $user;      //конструктор     function ValidateUser ($user)     {         $this->user=$user;         $valid=new Validations();              }      // Проверяет, корректно ли заполнено поле login,     // если нет - пишем сообщение о ошибке в $error     function validate()     {         if (!preg_match('/^[a-zA-Z0-9_]+$/',$this->user ))         {             $this->setError('Логин содержит заприщенные символы');         }         if (strlen($this->user) < 6 )         {             $this->setError('Логин слишком короткий');         }         if (strlen($this->user) > 20 )         {             $this->setError('Логин слишком длинные');         }     } }  ?>  

Проверяем пароль:

<?php class ValidatePassword extends Validations {      //Private $pass содержимое поля password     var $password;         //конструктор     function ValidatePassword ($pass)     {         $this->pass=$pass;        $valid=new Validations();     }           function validate()     {                        if (strlen($this->pass) < 6 )         {             $this->setError('Парль слишко короткий');         }            } }  ?>  

Все, испытываем

<? $checkLogin=new ValidateLogin('mylogin'); $checkPassword=new ValidatePassword('пароль');  if(!$checkLogin->isValid() || !checkPassword->isValid())  { тут пишем то, что должна сделать программа если логин и пароль не верен. }  ?> 

Вот и все! В реальной программе для проверки логин и пароля, конечно делать не стоит. P.S Я понимаю, что тут много есть людей которые считают такое детским садом, поэтому предупреждаю что это для новичков. Спасибо за внимание.

ссылка на оригинал статьи http://habrahabr.ru/post/176471/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *