ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ Π¨Π°Π±Π»ΠΎΠ½ΠΎΠ² ΠΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ (Design Patterns) Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ Π½Π° PHP.
ΠΠ°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊ Π½Π΅ΠΌΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΡΠΎΡΠΊΡ Π΄ΠΎΡΡΡΠΏΠ°.
- ΠΠ°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ°
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΡΠΎΡΠΊΡ Π΄ΠΎΡΡΡΠΏΠ°
// 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)); */
ΠΠ°ΡΡΠ΅ΡΠ½ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²-ΠΊΠ»ΠΎΠ½ΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°-ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΏΠΎΡΠΎΠ± ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ±ΡΡΠ½ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄ 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
ΠΠΎΠ»Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΠΎΠ΄ ΡΡΡΠΎΠΈΡΠ΅Π»ΡΡΡΠ²Π° Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π½ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
- ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΡΡΠ°ΠΏΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ "ΡΠ΅Π»Π΅ΡΠΊΠΎΠΏΠΈΡΠ΅ΡΠΊΠΈΡ
" ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ²
__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> */
ΠΠΎΠ»Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠ±ΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΡΡΠΏΠ΅ΡΠΊΠ»Π°ΡΡΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠΈΠΏ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
ΠΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π΅ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ 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"} */
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΡΡΡ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΊΠ»Π°ΡΡΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ - ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π±Π΅Π· ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠ±ΡΡΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ°Π±ΡΠΈΠΊΠΈ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅, ΠΏΡΠΈΡΠ΅ΠΌ ΡΠΈΠΏ ΡΠ°Π±ΡΠΈΠΊΠΈ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ, ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
- Π‘ΠΊΡΡΠ²Π°Π΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ
- Π Π΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ Π½Π°Π±ΠΎΡΠ° ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΏΡΠΈ ΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ
// 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> */
ΠΠ΄Π°ΠΏΡΠΈΡΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΊ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ (ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π½ΠΈΠΊΠΎΠΌ). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ ΠΈ Π΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ ΠΊΠΎΠ΄ΠΎΠΌ Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΊΠΎΠ΄ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, Π° ΠΏΠΈΡΠ΅ΠΌ Π΄Π»Ρ Π½Π΅Π³ΠΎ Π°Π΄Π°ΠΏΡΠ΅Ρ - "ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ" ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Ρ ΡΠ°Π½ΠΈΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° Π½Π΅Π³ΠΎ, ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΌΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π°Π΄Π°ΠΏΡΠ΅Ρ Π² Π»ΡΠ±ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ, ΠΊΠ°ΠΊ Π΄Π»Ρ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΡΠ°ΡΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Ρ Π½ΠΎΠ²ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΡΠ°ΠΊ ΠΈ Π»ΡΠ±ΠΎΠΉ Π½ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠ΅ΠΌ ΡΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ ΠΊΠ»Π°ΡΡ, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ
- ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠ², Π½ΠΎ Π² Π½ΠΈΡ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΎΠ±ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ (ΠΈ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΡΡΠΏΠ΅ΡΠΊΠ»Π°ΡΡ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ)
$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.. */
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
- ΠΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΊΠ»Π°ΡΡ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΡ "Π² ΡΠ΅ΠΏΠΎΡΠΊΠ΅"
- ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊΠΎΠ³Π΄Π° Π½Π΅Π»ΡΠ·Ρ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ
$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 */
ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ².
- ΠΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΠ΅Π·Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ΅
- ΠΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ Π½Π° "ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ"
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]');
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Π΄ΡΠ΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π΅ΠΉ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΡΡΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π² ΡΠΎΡΡΠ°Π²Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΡΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ. Π’Π΅, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΡΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠ²ΠΎΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ Π½Π΅ Π·Π½Π°Π΅Ρ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π½ΠΈΠΌ β ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ»ΠΈ ΡΠΎΡΡΠ°Π²Π½ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΌΡ ΠΊΠΎΠ΄Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄Π΅ΡΠ΅Π²ΡΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π»ΡΠ±ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΡΡΡ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΊΠ»Π°ΡΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΡ Π΄Π΅ΡΠ΅Π²ΠΎ.
- Π£ΠΏΡΠΎΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π»ΡΠ±ΡΠΌΠΈ Π΄ΡΠ΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡΠΌΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΡΡΠ΅ ΠΈ ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ
$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
Π Π°Π·Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»Π°ΡΡΠΎΠ² Π½Π° Π΄Π²Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ β Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°.
ΠΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠΠΎΠ³Π΄Π° ΠΊΠ»Π°ΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΡΡ Π² Π΄Π²ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΡΡ , ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠ΅ΠΉ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ², Ρ ΡΠ°Π½Ρ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΅Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅.
- ΠΠΎΠ»Π΅Π·Π΅Π½ Π² ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»Π°ΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΡΡ Π² Π΄Π²ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΡΡ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
- Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
// 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
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ "Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅Π»ΠΈ". ΠΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ Π²ΡΠ·ΠΎΠ²Ρ ΠΊ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π΄ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π°.
ΠΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ "Π΄ΡΠ±Π»Π΅Ρ", ΠΈΠΌΠ΅ΡΡΠΈΠΉ ΡΠΎΡ ΠΆΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΡΡΠΎ ΠΈ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΠΊΠ»Π°ΡΡ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π»Ρ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠΈΡ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π² Π½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅. Π Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΎΠ±ΡΠ΅ΠΊΡ-Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΉ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
- ΠΠΎΠ»Π΅Π·Π΅Π½ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ "Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ"
- ΠΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ (ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ, Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ Ρ.Π΄.), ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
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 */
ΠΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΠΏΠ°ΠΌΡΡΡ, ΡΠ°Π·Π΄Π΅Π»ΡΡ ΠΎΠ±ΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ, Π²ΠΌΠ΅ΡΡΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅.
ΠΠ΅Π³ΠΊΠΎΠ²Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΈΠΌΠ΅ΡΡΠ΅ΠΉ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΠ°ΡΡΠ΅ΡΠ½ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ β "Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΡ" ΠΈ "ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ". Π’Π΅ΠΏΠ΅ΡΡ, Π²ΠΌΠ΅ΡΡΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ ΡΡ Π΄Π°Π½Π½ΡΡ Π²ΠΎ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ , ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±ΡΠ΄ΡΡ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Ρ ΡΠ°Π½ΡΡΠΈΡ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅. ΠΠ»ΠΈΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΡΠ°Π±ΡΠΈΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΊΡΡΠ²Π°Π΅Ρ ΠΎΡ Π½Π΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠΈΡ Π΄Π°Π½Π½ΡΡ .
Π Π΅Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Π½Π° 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
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ/Π²ΡΠ·ΠΎΠ²Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ². ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠ΅ΡΠ°Π΅Ρ, ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΎΠ½ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡ ΡΠ°ΠΌ ΠΈ ΡΡΠΎΠΈΡ Π»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π·Π°ΠΏΡΠΎΡ Π΄Π°Π»ΡΡΠ΅ ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅. ΠΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠ²ΡΠ·Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π² ΠΎΠ΄Π½Ρ ΡΠ΅ΠΏΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π² ΡΠ΅ΠΏΠΈ ΠΈ ΡΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌ ΡΡΠΎ-ΡΠΎ Ρ Π½ΠΈΠΌ ΡΠ΄Π΅Π»Π°ΡΡ, Π½ΠΎ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΡΠ΅ΠΏΠΎΡΠΊΠ΅.
- ΠΠ°ΠΏΡΡΠΊΠ°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄ΡΡΠ³ΠΈΠΌ Π² ΡΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΡΠ΅ΠΏΠΎΡΠΊΠ΅
- ΠΠΎΠ³Π΄Π° Π·Π°ΡΠ°Π½Π΅Π΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ Π½ΠΈΡ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ
// 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.. */
ΠΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ ΡΠ°ΠΌΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΈ Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ. ΠΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ, Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΡΡΠΎΡΠΈΡ, ΠΎΡΠΌΠ΅Π½ΡΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π²ΠΎ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
- ΠΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ, ΠΎΡΠΌΠ΅Π½ΡΡΡ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ Ρ.Π΄.
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ
$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.. */
ΠΠΎΠ»Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΎΡΡΠ°Π²Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½Π΅ ΡΠ°ΡΠΊΡΡΠ²Π°Ρ ΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΠ΄Π΅Ρ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΡΠ½Π΅ΡΡΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ ΠΎΠ΄Π° ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΈΠ· ΡΠ°ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ.
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΈ ΡΠΊΡΡΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄Π΅ΡΠ°Π»ΠΈ Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΎΠ±Ρ ΠΎΠ΄Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈ ΡΠΎΠΉ ΠΆΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π΅Π΄ΠΈΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΎΠ±Ρ ΠΎΠ΄Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ
- ΠΠ°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ
- ΠΠ°ΡΠ°ΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ, Π½ΠΎ ΠΈ Π½Π°Π΄Π΅Π»ΠΈΡΡ ΠΎΠ±Ρ ΠΎΠ΄ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ
$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
, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅ΠΌ Π²ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΡΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠ°ΠΊ ΡΡΠΎ ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ Π±ΡΠ΄ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊΠ°. Π’Π΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΌΡ ΠΈΠ·Π±Π°Π²ΠΈΠΌΡΡ ΠΎΡ ΡΠΈΠ»ΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·Π½ΠΎΡΡΠΈ.
ΠΠ±ΡΠ΅ΠΊΡΡ Π±ΡΠ΄ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊΠ° ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ Π΅Π³ΠΎ ΠΏΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΠ±ΡΡΠΈΡΡ . Π ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊ ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°. Π’Π°ΠΊ, ΡΡΠΎ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΈΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ.
- Π£Π±ΠΈΡΠ°Π΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΡ, Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ΠΈ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌΠΈ ΠΎΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊΠ°
- Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΡΠ΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅
$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();
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΈ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΡΠΎΡΠ»ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² "ΡΠ½ΠΈΠΌΠΊΠΈ", Π½Π΅ ΡΠ°ΡΠΊΡΡΠ²Π°Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠ΅ΠΉ ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π‘Π½ΠΈΠΌΠΎΠΊ β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ (ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²) ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ. ΠΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅-ΡΠ½ΠΈΠΌΠΊΠ΅ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ·Π½Π°ΡΡ Π΄Π°ΡΡ ΠΈΠ·Π³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ½ΠΈΠΌΠΊΠ°. ΠΠ°ΡΡΠ΅ΡΠ½ ΠΏΠΎΡΡΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ°ΠΌΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΈΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π²Π»Π°Π΄Π΅Π΅Ρ.
Π Π΅Π°Π»ΡΠ½Π°Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Π‘Π½ΠΈΠΌΠΎΠΊ Π² 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. */
Π‘ΠΎΠ·Π΄Π°Π΅Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ "ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ", ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΎΠ΄Π½ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΡΠ»Π΅Π΄ΠΈΡΡ ΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ, ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΡΡΠΈΠ΅ Π² Π΄ΡΡΠ³ΠΈΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ
. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΡΡΠΎ "ΠΈΠ·Π΄Π°ΡΠ΅Π»ΠΈ" 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 */
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΡΡ ΠΎΠΆΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠ°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΡΠΎΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΠ³ΡΠ°ΡΡ ΡΠΎΠ»Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΡΡΡΠ»Π°ΡΡΡ Π½Π° ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΉ ΠΈ Π΄Π΅Π»Π΅Π³ΠΈΡΡΡ Π΅ΠΉ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ. Π§ΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ, Π²Π°ΠΌ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ Π² ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ-ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ.
- ΠΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠ°Π·Π½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΡΡ ΡΡΠΈ ΡΠΏΠΎΡΠΎΠ±Ρ Π² ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ½Π΅ΡΡΠΈ ΠΎΡΠ»ΠΈΡΠ°ΡΡΠ΅Π΅ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ², ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ 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.. */
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠ°.
Π¨Π°Π±Π»ΠΎΠ½ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π½Π°Π΄ΡΡΡΠΎΠΉΠΊΡ Π½Π°Π΄ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ. ΠΠ±Π° ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π΄Π΅Π»Π΅Π³ΠΈΡΡΡ ΡΠ°Π±ΠΎΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ°ΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ Π² Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π΅ Π·Π½Π°ΡΡ Π΄ΡΡΠ³ ΠΎ Π΄ΡΡΠ³Π΅ ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡΠ²ΡΠ·Π°Π½Ρ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΡΠ°ΠΌΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ.
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ², ΡΠ°Π·Π±ΡΠΎΡΠ°Π½Π½ΡΡ ΠΏΠΎ ΠΊΠΎΠ΄Ρ
$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 */
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΊΠ°ΡΠΊΠ°Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°ΠΌ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ°ΠΏΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΅Π³ΠΎ ΡΡΡΡΠΊΡΡΡΡ.
ΠΡ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ°Π³ΠΎΠ², ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΡΠΈ ΡΠ°Π³ΠΈ Π² ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΈΡ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄ΡΡΠ³ΠΈΠΌ Π²Π½ΡΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ "ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠ³ΠΎ" ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΠΎΠ΄ΠΊΠ»Π°ΡΡΡ ΡΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠ°Π³ΠΈ, Π½ΠΎ Π½Π΅ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ "ΡΠ°Π±Π»ΠΎΠ½Π°". ΠΡ ΡΠΎΡ ΡΠ°Π½ΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ², Π½ΠΎ Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΠΈΡ ΡΠ°Π³ΠΎΠ² Π² ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ .
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°ΠΌ ΡΠ°ΡΡΠΈΡΡΡΡ Π±Π°Π·ΠΎΠ²ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ, Π½Π΅ ΠΌΠ΅Π½ΡΡ Π΅Π³ΠΎ ΡΡΡΡΠΊΡΡΡΡ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ±ΡΠ°ΡΡ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠ»Π°ΡΡΠ°Ρ Ρ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΠΈΡ ΡΡ Π² Π΄Π΅ΡΠ°Π»ΡΡ
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.. */
ΠΠΎΠ»Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ) Π½ΠΎΠ²ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ±ΡΠΈΠΉ ΡΠΌΡΡΠ» ΠΈΠ»ΠΈ ΠΎΠ΄Π½Ρ ΡΠ΅Π»Ρ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ², Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ ΠΏΠΎ ΡΠ°Π·Π½ΠΎΠΌΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΊΡΠΏΠΎΡΡ ΡΡΡΠ½ΠΎΡΡΠΈ).
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π½Π΅ ΠΌΠ΅Π½ΡΡ ΠΊΠ»Π°ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»Ρ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ.
ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ "Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ" (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> */