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

в 9:47, , рубрики: php, метки:

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

Автор: vov4ik08

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js