четверг, 23 ноября 2017 г.

Реализация паттерна Стратегия PHP

Паттерн стратегия может быть очень полезен в тех ситуациях, когда вы замечаете, что каждое расширение вашего кода требует внесение изменений в двух или трех местах кода одновременно, это верный признак того, что вы захардкодили то, что должно было быть поведением.
<?php


class SyncService
{
    public function generateFile(XMLGenerationStrategy $strategy)
    {
        if ($strategy->checkResourceType()) {
            $strategy->saveFileXML(
                $strategy->genearateXML()
            );
        }
    }
}


interface XMLResource
{
}


interface XMLGenerationStrategy
{
    public function genearateXML();
    public function checkResourceType();
    public function saveFileXML($xmlString);
}


abstract class XMLStrategy
{
    protected $resource;


    public function __construct(XMLResource $resource)
    {
        $this->resource = $resource;
    }
}


class AddmoneyXMLStrategy extends XMLStrategy implements XMLGenerationStrategy
{
    public function checkResourceType()
    {
        return $this->resource instanceof AddMoney;
    }


    public function genearateXML()
    {
        return 'addmoney xml string ' . $this->resource->getAmount() . "\n";
    }


    public function saveFileXML($xmlString)
    {
        print($xmlString);
    }
}


class AddMoney implements XMLResource
{
    public function getAmount()
    {
        return '10 000 RUB';
    }
}


class ServiceXMLStrategy extends XMLStrategy implements XMLGenerationStrategy
{
    public function checkResourceType()
    {
        return $this->resource instanceof Service;
    }


    public function saveFileXML($xmlString)
    {
        print($xmlString);
    }


    public function genearateXML()
    {
        return 'service xml string ' . $this->resource->getName() . "\n";
    }
}


class Service implements XMLResource
{
    public function getName()
    {
        return 'SVETOFOR';
    }
}


$addMoney = new AddMoney();
$service = new Service();


$syncService = new SyncService();
$syncService->generateFile(new AddmoneyXMLStrategy($addMoney));
$syncService->generateFile(new ServiceXMLStrategy($service));

Комментариев нет:

Отправить комментарий

Yii2 запуск миграций из любой директории

Для этого можно использовать ключ migrationPath php yii migrate --migrationPath="vendor\yiisoft\yii2\rbac\migrations"