Skip to content

sauron918/design-patterns-cookbook

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

37 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Design Patterns Cookbook

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ самых популярных Π¨Π°Π±Π»ΠΎΠ½ΠΎΠ² ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ (Design Patterns) с описаниСм ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° PHP.

1. ΠŸΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ (Creational Patterns)

ΠžΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΠ° (Singleton)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΈ прСдоставляСт ΠΊ Π½Π΅ΠΌΡƒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ доступа.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ СдинствСнного экзСмпляра класса
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ доступа

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

// there is the only one way to get an application instance
$app = Application::getInstance();
// every call will give us the same instance
assert(Application::getInstance() === $app);

/* Next calls will produce errors:
$app = new Application();
$app = clone $app;
$app = unserialize(serialize($app)); */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ (Prototype)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ описываСт процСсс создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-ΠΊΠ»ΠΎΠ½ΠΎΠ² Π½Π° основС ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ описываСт способ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса клонирования. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ опСрация клонирования ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ getClone(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описан Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС.

Π’ PHP Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ клонирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² встроСна, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова clone Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ копию ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ клонирования Π² класс, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ __clone().

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π΅ вдаваясь Π² подробности ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

class Page
{
    public function __construct(string $title)
    {
        $this->title = $title;
    }
    
    // cloning method, each object should implement how he will be cloned himself
    public function getClone()
    {
        return new static($this->title);
    }
}

$page = new Page('Page Title');
echo $pageClone = $page->getClone(); // Page Title

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ | Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ (Builder)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ пошагово, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²Π° для получСния Ρ€Π°Π·Π½Ρ‹Ρ… прСдставлСний ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ процСсс поэтапного построСния слоТного ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ "тСлСскопичСских" конструкторов __construct($param1, $param2, ..., $paramN)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$page = (new PageBuilder('<h1>Home page</h1>'))
    ->addHeader('<header></header>')
    ->addContent('<article>content</article>');

// some time letter ...
$page->addFooter('<footer></footer>');

echo $page->build()->show();
/* Output:
  <h1>Home page</h1><header></header><article>content</article><footer></footer> */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ | Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π€Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (Factory Method)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² супСрклассС, позволяя подклассам ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new, Π° Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² особого Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всС Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ new, Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π§Ρ‚ΠΎΠ±Ρ‹ эта систСма Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»Π°, всС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наслСдованиС ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ созданиС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… экзСмпляров
  • Π Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π±Π΅Π· указания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… классов
  • ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ΡΡ ΠΊΠΎΠ³Π΄Π° систСма Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΠΉ, ΠΏΡƒΡ‚Π΅ΠΌ добавлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

abstract class Response {}
class JSONResponse extends Response {}
class HTMLResponse extends Response {}

interface Formatter {}
class HTMLFormatter implements Formatter {}
class JSONFormatter implements Formatter {}

// type can be taken from configuration for instance,
// JsonResponse will use JSONFormatter (see full example)
echo $response = new JsonResponse('some input data');

/* Output: {"code": 200, "response": "some input data"} */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Абстрактная Ρ„Π°Π±Ρ€ΠΈΠΊΠ° (Abstract Factory)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ сСмСйства связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π΅ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡΡΡŒ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ классам создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Или Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами - прСдусматриваСт интСрфСйс для создания сСмСйства связанных ΠΈΠ»ΠΈ зависимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· указания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… классов. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ ΠΏΡ€ΠΈ запускС, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚ΠΈΠΏ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ выбираСтся, исходя ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² окруТСния ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • Π‘ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ клиСнтского ΠΊΠΎΠ΄Π° подробности Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ созданы
  • Π Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ нСсовмСстимости Π½Π°Π±ΠΎΡ€Π° связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈ ΠΈΡ… создании

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

// the factory is selected based on the environment or configuration parameters
$templateEngine = 'blade';
switch ($templateEngine) {
    case 'smarty':
        $templateFactory = new SmartyTemplateFactory();
        break;
    case 'blade':
        $templateFactory = new BladeTemplateFactory();
        break;
}

// we will have header and body as either Smarty or Blade template, but never mixed
echo $templateFactory->createHeader()->render();
echo $templateFactory->createBody()->render();
/* Output: <h1>{{ $title }}</h1><main>{{ $content }}</main> */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

2. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ (Structural Patterns)

АдаптСр (Adapter)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

АдаптируСт ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΌΡƒ интСрфСйсу (являСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π½ΠΈΠΊΠΎΠΌ). НапримСр, Ρƒ вас Π΅ΡΡ‚ΡŒ класс ΠΈ Π΅Π³ΠΎ интСрфСйс Π½Π΅ совмСстим с ΠΊΠΎΠ΄ΠΎΠΌ вашСй систСмы, Π² этом случаС ΠΌΡ‹ Π½Π΅ измСняСм ΠΊΠΎΠ΄ этого класса, Π° пишСм для Π½Π΅Π³ΠΎ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ - "ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылку Π½Π° Π½Π΅Π³ΠΎ, ΠΈ нСпосрСдствСнно ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ интСрфСйс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΌΡƒ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ Π² любом Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, ΠΊΠ°ΠΊ для ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ старой систСмы Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» с Π½ΠΎΠ²Ρ‹ΠΌ интСрфСйсом, Ρ‚Π°ΠΊ ΠΈ любой Π½ΠΎΠ²Ρ‹ΠΉ интСрфСйс Π² соотвСтствии с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сторонний класс, Ссли Π΅Π³ΠΎ интСрфСйс Π½Π΅ совмСстим с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ
  • Когда Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… подклассов, Π½ΠΎ Π² Π½ΠΈΡ… Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ супСркласс ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$book = new Book();
$book->open();
$book->turnPage();

// transform Kindle e-book to the 'simple book' interface
$book = new KindleAdapter(new Kindle());
echo $book->open();
echo $book->turnPage();

/* Output:
Open the book..
Go to the next page..

Turn on the Kindle..
Press next button on Kindle.. */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ (Decorator)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ динамичСски Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½Π΅ измСняя ΠΈΡ… интСрфСйс.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ класс ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ дСйствиСм, Π½Π΅ измСняя интСрфСйс
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ "Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅"
  • ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ΡΡ ΠΊΠΎΠ³Π΄Π° нСльзя Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ обязанности ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ наслСдования

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$coffee = new SimpleCoffee();
// apply the Decorator for the $coffee object
$milkCoffee = new MilkCoffee($coffee);
// we also can use chain calls of Decorators
$vanillaMilkCoffee = new VanillaCoffee(new MilkCoffee(new SimpleCoffee()));

/** Output:
Coffee
Coffee, with milk
Coffee, with milk, with vanilla */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Ѐасад (Facade)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ интСрфСйс ΠΊ слоТной систСмС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈΠ»ΠΈ систСмС классов.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ простой ΠΈΠ»ΠΈ ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ интСрфСйс ΠΊ слоТной подсистСмС
  • ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ произвСсти Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ слоТной подсистСмы Π½Π° "подсистСмы"

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

class SignUpFacade
{
    public function signUpUser($userName, $userPass, $userMail)
    {
        $this->validator->isValidMail($userMail);
        $this->userService->create($userName, $userPass, $userMail);
        $this->mailService->to($userMail)->subject('Welcome')->send();
    }
}

// we make an abstraction above user registration process
$facade = new SignUpFacade();
$facade->signUpUser('Sergey', '123456', '[email protected]');

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ (Composite)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мноТСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡƒΡŽ структуру, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½Π΅ΠΉ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ это Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² составных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ простыС ΠΈΠ»ΠΈ составныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π’Π΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свои Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со всСми ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс ΠΈ Π½Π΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ β€” простой ΠΈΠ»ΠΈ составной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π­Ρ‚ΠΎ позволяСт клиСнтскому ΠΊΠΎΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² любой слоТности, Π½Π΅ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡΡΡŒ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ классам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π΄Π΅Ρ€Π΅Π²ΠΎ.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • Π£ΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ рСкурсивными структурами
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ простыС ΠΈ составныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$shoppingCart[] = new Product('Bike', 200);

$motorcycle = new CompositeProduct('Motorcycle');
$motorcycle->add(new Product('Motor', 700));
$motorcycle->add(new Product('Wheels', 300));

$frame = new CompositeProduct('Frame');
$frame->add(new Product('Steering', 200.00));
$frame->add(new Product('Seat', 100));
$motorcycle->add($frame);

$shoppingCart[] = $motorcycle;

// calculate a total price of shopping cart
$totalPrice = 0;
foreach ($shoppingCart as $cartItem) {
    $totalPrice += $cartItem->getPrice();
}
echo $totalPrice;   // Output: 1500

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠœΠΎΡΡ‚ (Bridge)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

РаздСляСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько классов Π½Π° Π΄Π²Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ β€” Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, позволяя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ наслСдованиС Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Когда класс Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Π² Π΄Π²ΡƒΡ… нСзависимых плоскостях, ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… плоскостСй Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ классов, храня ссылку Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ классС.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ПолСзСн Π² ситуации, ΠΊΠΎΠ³Π΄Π° класс Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Π² Π΄Π²ΡƒΡ… нСзависимых плоскостях
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½Ρ‹ΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π° Π±ΠΎΠ»Π΅Π΅ спСциализированныС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
  • БохраняСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

// some 'abstraction' hierarchy
abstract class WebPage 
{
    // ...
    public function __construct(Theme $theme)
    {
        $this->theme = $theme;
    }
}
class HomePage extends WebPage {}
class AboutPage extends WebPage {}

// separate 'implementation' hierarchy
interface Theme {}
class DarkTheme implements Theme {}
class LightTheme implements Theme {}

$homePage = new HomePage(new DarkTheme());
echo $homePage->getContent();       // Output: Home page in Dark colors

$lightTheme = new LightTheme();
$aboutPage = new AboutPage($lightTheme);
echo $aboutPage->getContent();      // Output: About page in White colors

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π—Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ (Proxy)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ вмСсто Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ "Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΠΈ". Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΊ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, позволяя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎ ΠΈΠ»ΠΈ послС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°.

Π—Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс "Π΄ΡƒΠ±Π»Π΅Ρ€", ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‚ ΠΆΠ΅ интСрфСйс, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² класс замСститСля ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ ΠΈΠ»ΠΈ послС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² этих ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² настоящСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. А благодаря ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΌΡƒ интСрфСйсу, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² любой ΠΊΠΎΠ΄, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ПолСзСн Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ "Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ"
  • ПолСзСн ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ повСдСния (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, логирования, ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Ρ‚.Π΄.), сохраняСт ΠΏΡ€ΠΈ этом интСрфСйс ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

class WeatherProxy implements WeatherClient
{
    // ...
    public function getWeather(string $location): string
    {
        if (!isset($this->cache[$location])) {
            echo "cache: MISS\n";
            $this->cache[$location] = $this->client->getWeather($location);
        } else {
            echo "cache: HIT\n";
        }

        return $this->cache[$location];
    }
}

# Client code example
$weather = new Weather('177b4a1be7dfd10e0d30e8fdeabe0ea9');
$proxy = new WeatherProxy($weather);
echo $proxy->getWeather('Kiev');
echo $proxy->getWeather('Lviv');
echo $proxy->getWeather('Kiev');

/* Output example:
cache: MISS, weather: clear sky
cache: MISS, weather: scattered clouds
cache: HIT, weather: clear sky */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ЛСгковСс (Flyweight)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

Π­ΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ, раздСляя ΠΎΠ±Ρ‰Π΅Π΅ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ собой, вмСсто хранСния ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

ЛСгковСс примСняСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ большоС количСство ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ раздСляСт Π΄Π°Π½Π½Ρ‹Π΅ этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Π΄Π²Π΅ части β€” "лСгковСсы" ΠΈ "контСксты". Π’Π΅ΠΏΠ΅Ρ€ΡŒ, вмСсто хранСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° нСсколько ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², хранящих эти Π΄Π°Π½Π½Ρ‹Π΅. ΠšΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ, которая скрываСт ΠΎΡ‚ Π½Π΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….

РСальноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Π½Π° PHP встрСчаСтся довольно Ρ€Π΅Π΄ΠΊΠΎ. Π­Ρ‚ΠΎ связано с ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΎΠΌ PHP, Π³Π΄Π΅ Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π’Π‘Π• ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ вашСго прилоТСния Π² памяти ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ большСС количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$shoppingCart = new ShoppingCart();
$shoppingCart->addProduct('Sports shoes', 120, 'Nike');
$shoppingCart->addProduct('Kids shoes', 100, 'Nike');
$shoppingCart->addProduct('Women shoes', 110, 'Nike');
$shoppingCart->addProduct('Running shoes', 140, 'Asics');
$shoppingCart->addProduct('Everyday shoes', 90, 'Adidas');

echo count($shoppingCart->getProducts()); // 5 products in basket
echo count(ProductFactory::$brandTypes); // and only 3 unique brands instances in memory

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

3. ΠŸΠΎΠ²Π΅Π΄Π΅Π½Ρ‡Π΅ΡΠΊΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ (Behavioral Patterns)

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° обязанностСй (Chain of Responsibility)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ запросы/Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ запрос сам ΠΈ стоит Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ запрос дальшС ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π² ΠΎΠ΄Π½Ρƒ Ρ†Π΅ΠΏΡŒ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ссылку Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² Ρ†Π΅ΠΏΠΈ ΠΈ смоТСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сам Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ с Π½ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ находятся Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅
  • Когда Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстно, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ запросы Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для Π½ΠΈΡ… понадобятся

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

// build the chain
$logger = new DBLogger();
$logger->setNext(new MailLogger())
    ->setNext(new FileLogger());

$logger->handle($message);
/* Output:
Save to database.. 
Send by email.. 
Save to log file.. */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Команда (Command)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя само дСйствиС ΠΈ Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ, ΠΎΡ‚ΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎ внСшниС сСрвисы ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΡ‚ΠΌΠ΅Π½ΡΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ Ρ‚.Π΄.
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ отдСлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΡ‚ получатСля

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$invoker = new Invoker();
$receiver = new Receiver();

$invoker->pushCommand(new TurnOnCommand($receiver));
$invoker->pushCommand(new TurnOffCommand($receiver));
$invoker->execute();

/* Output:
Receiver: Turning on something..
Receiver: Turning off something.. */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ | Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ (Iterator)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ элСмСнты составных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π΅ раскрывая ΠΈΡ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ прСдставлСния. ИдСя ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вынСсти ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΈΠ· самой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ слоТныС структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈ этом Π΄Π΅Ρ‚Π°Π»ΠΈ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ…
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ интСрфСйс ΠΎΠ±Ρ…ΠΎΠ΄Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… структур Π΄Π°Π½Π½Ρ‹Ρ…
  • Π”Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ
  • Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ доступ ΠΊ элСмСнтам, Π½ΠΎ ΠΈ Π½Π°Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$collection = (new SimpleCollection())->addItem('1st item')
    ->addItem('2nd item')
    ->addItem('3rd item');

// go through collection in reverse order
foreach ($collection->getIterator() as $item) {
    echo $item . PHP_EOL;
}

/* Output:
3rd item
2nd item
1st item */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ | Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊ(Mediator)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊ ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ прямыС связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, заставляя ΠΈΡ… ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· сСбя.

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ опрСдСляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт Π»ΠΎΠ³ΠΈΠΊΡƒ взаимодСйствия Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊ обСспСчиваСт ΡΠ»Π°Π±ΡƒΡŽ ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒ благодаря Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π° явно ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈΡ… взаимодСйствия нСзависимо. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Допустим Π² нашСй систСмС Π΅ΡΡ‚ΡŒ мноТСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ (часто ΠΈΡ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ "ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ"). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° дСйствиС Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Ρƒ Π΄Ρ€ΡƒΠ³Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ сильно связанными. ΠœΡ‹ создаСм ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Mediator, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСнСсСм всю Π»ΠΎΠ³ΠΈΠΊΡƒ взаимодСйствия этого Π½Π°Π±ΠΎΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ вмСсто обращСния Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒ посрСдника. Π’Π΅ΠΌ самым ΠΌΡ‹ избавимся ΠΎΡ‚ сильной связности.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ссылку Π½Π° посрСдника ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… событиях. А посрСдник свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ссылки Π½Π° всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· этого мноТСства. Π’Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π² соотвСтствии с Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΈΡ… взаимодСйствия Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ запросы ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • Π£Π±ΠΈΡ€Π°Π΅Ρ‚ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ систСмы, вмСсто этого ΠΎΠ½ΠΈ становятся зависимыми ΠΎΡ‚ самого посрСдника
  • Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$chat = new ChatMediator();

$john = new User('John', $chat);
$jane = new User('Jane', $chat);
$bot = new Bot($chat);

// every chat member interacts with mediator,
// but not with with each other directly
$john->sendMessage("Hi!");
$jane->sendMessage("What's up?");
$bot->sayHello();

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π‘Π½ΠΈΠΌΠΎΠΊ (Memento)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡˆΠ»Ρ‹Π΅ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² "снимки", Π½Π΅ раскрывая подробностСй ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π‘Π½ΠΈΠΌΠΎΠΊ β€” это простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащий состояниС (состояниС свойств) создатСля. ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ копию состояния Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅-снимкС с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ интСрфСйсом, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠ·Π½Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ изготовлСния ΠΈΠ»ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ снимка. ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΏΠΎΡ€ΡƒΡ‡Π°Π΅Ρ‚ созданиС ΠΊΠΎΠΏΠΈΠΈ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° самому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ этим состояниСм Π²Π»Π°Π΄Π΅Π΅Ρ‚.

РСальная ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Π‘Π½ΠΈΠΌΠΎΠΊ Π² PHP ΠΏΠΎΠ΄ большим вопросом. Π§Π°Ρ‰Π΅ всСго Π·Π°Π΄Π°Ρ‡Ρƒ хранСния ΠΊΠΎΠΏΠΈΠΈ состояния ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΊΡƒΠ΄Π° ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ сСриализации (примСнСния Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² serialize() ΠΈ unserialize())

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ любоС количСство "снимков" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… нСзависимо ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Π° состояния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ссли опСрация Π½Π΅ ΡƒΠ΄Π°Π»Π°ΡΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$editor = new Editor();
$editor->type('This is the first sentence.');
$editor->type('This is second.');
// make a snapshot
$memento = $editor->save();

$editor->type('And this is third.');
echo $editor->getContent();
/* Output: This is the first sentence. This is second. And this is third. */

// restore the state from snapshot
$editor->restore($memento);
echo $editor->getContent();
/* Output: This is the first sentence. This is second. */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ (Observer)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ "подписки", ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ΄Π½ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° события, происходящиС Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ участники ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° это "ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ" Subject ΠΈ "подписчики" Observer.

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° "издатСля" список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² подписчиков. А Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… "подписчики" ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° события.

PHP ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько встроСнных интСрфСйсов SplSubject, SplObserver, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свои Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° события, происходящиС Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…
  • ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ получСния ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠΉ динамичСски, Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$cart = new Cart(); // subject
$cart->attach(new LoggingListener()); // attach an Observer
$cart->setBalance(10); // trigger an event

/* Output:
Notification: balance of the shopping cart was changed to 10 */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

БтратСгия (Strategy)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ сСмСйство схоТих Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π² собствСнный класс, прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ класс сам выполнял Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Ρ€ΠΎΠ»ΡŒ контСкста, ΡΡΡ‹Π»Π°ΡΡΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈΠ· стратСгий ΠΈ дСлСгируя Π΅ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ достаточно ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ класс Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠžΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ способы произвСсти ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ дСйствиС, позволяя Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ эти способы Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ контСкста
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ вынСсти ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ классов, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ количСство if-else ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ зависимости Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², скрыв Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ классов-стратСгий

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

interface SortStrategy
{
    public function sort(array $data): array;
}
class BubbleSortStrategy implements SortStrategy {}
class QuickSortStrategy implements SortStrategy {}

$data = [4, 2, 1, 5, 9];
// for small amount of data the "Bubble Sort" algorithm will be used
// and for large amounts - the "Quick Sort" algorithm
if (count($data) < 10) {
    $sorter = new Sorter(new BubbleSortStrategy());
    $sorter->sortArray($data);
} else {
    $sorter = new Sorter(new QuickSortStrategy());
    $sorter->sortArray($data);
}

/* Output: Sorting using bubble sort.. */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

БостояниС (State)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ своС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² зависимости ΠΎΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ состояния, являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°.

Π¨Π°Π±Π»ΠΎΠ½ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ надстройку Π½Π°Π΄ шаблоном БтратСгия. Оба ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ основного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, дСлСгируя Ρ€Π°Π±ΠΎΡ‚Ρƒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ-ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ°ΠΌ. Однако Π² Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ Π·Π½Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ ΠΎ Π΄Ρ€ΡƒΠ³Π΅ ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ связаны, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Бостоянии сами ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ состояния ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ контСкст.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² зависимости ΠΎΡ‚ своСго состояния
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ условных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², разбросанных ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$editor = new TextEditor(new DefaultState());
$editor->type('First line');

$editor->setState(new UpperCase());
$editor->type('Second line');

$editor->setState(new LowerCase());
$editor->type('Third line');

/* Output:
First line
SECOND LINE
third line */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π¨Π°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (Template method)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ каркас Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ позволяСт подклассам ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ этапы Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π±Π΅Π· измСнСния Π΅Π³ΠΎ структуры.

ΠœΡ‹ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ шагов, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ эти шаги Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΈΡ… ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ "шаблонного" ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠŸΠΎΠ΄ΠΊΠ»Π°ΡΡΡ‹ смогут ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ шаги, Π½ΠΎ Π½Π΅ фактичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ "шаблона". ΠœΡ‹ сохраним ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π½ΠΎ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих шагов Π² унаслСдованных классах.

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ подклассам Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Π½Π΅ мСняя Π΅Π³ΠΎ структуры
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… классах с ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π² дСталях

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

abstract class AbstractFileConverter
{
    // template method
    final public function convert()
    {
        $this->beforeSteps();
        $this->openFile();
        $this->validate();
        $this->makeConversion();
        $this->closeFile();
        $this->afterSteps();
    }
}
// ...

(new PDFFileConverter())->convert();
/* Output:
Step1. Read from file..
Step2. Validate PDF file..
Step3. Convert PDF file..
Step4. Close a file descriptor.. */

(new CSVFileConverter())->convert();
/* Output:
Step1. Read from file..
Step2. Validate CSV file..
Step3. Convert CSV file..
Step4. Close a file descriptor.. */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ | Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ (Visitor)

Π‘ΡƒΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ связанных ΠΌΠ΅ΠΆΠ΄Ρƒ собой) Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями. Ѐункция, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠΉ смысл ΠΈΠ»ΠΈ ΠΎΠ΄Π½Ρƒ Ρ†Π΅Π»ΡŒ для всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этих классов, Π½ΠΎ рСализуСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ экспорт сущности).

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ мСняя классы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ. ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ посСтитСля Π½Π΅Ρ‚ нСобходимости ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ основныС классы.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ΡΡ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ "Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ диспСтчСризации" (Double Dispatch), ΠΊΠΎΠ³Π΄Π° конкрСтная рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, зависит ΠΈ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся ΠΈ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ классы ΡƒΠ·Π»ΠΎΠ² Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ всС-Ρ‚Π°ΠΊΠΈ придСтся. Π’Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ иСрархия ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², мСнялась Ρ€Π΅Π΄ΠΊΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° придСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ всСх ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… посСтитСлСй

КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚

  • Π”Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π±Π΅Π· внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² классы
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ‚ доступа ΠΈΠ»ΠΈ возмоТности ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ классы ΠΈΠ»ΠΈ Π½Π΅ хочСтся Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$report = new Report('report_title', 'report_content');

echo $report->accept(new JSONExportVisitor());
echo $report->accept(new XMLExportVisitor());

/* Output:
"report_title {diagram} report_content"
<?xml version="1.0" <xml><title>report_title<diagram> */

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Releases

No releases published

Packages

No packages published

Languages