рд░рдгрдиреАрддрд┐ рдмрд┐рд▓реНрдбрд░ рдпрд╛ рд╕рдордЧреНрд░ + рд░рдгрдиреАрддрд┐ рдЧрдардмрдВрдзрди

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рджреЛ рд╡реНрдпрд╛рдкрдХ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рд░рдгрдиреАрддрд┐ рдФрд░ рд╕рдордЧреНрд░ рдХреЗ рдкрд░рд╕реНрдкрд░ рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдо рддрдерд╛рдХрдерд┐рдд "рд░рдгрдиреАрддрд┐ рд╕рдВрдЧреАрддрдХрд╛рд░" рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рд╕рдорд╕реНрдпрд╛


рдЙрдирдХреЗ рд╕рдВрдпреБрдХреНрдд рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд░рдгрдиреАрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЬреАрд╡рди рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХрдИ рдШрдЯрдирд╛рдПрдВ рдШрдЯрд┐рдд рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд: рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЬрдиреНрдо рдХреА рддрд╛рд░реАрдЦ рднрд░ рджреА рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрдкрдиреЗ рдкрд╛рд╕рдкреЛрд░реНрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рдирд╣реАрдВ рднрд░рд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рдВрдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рд╢реНрдирд╛рд╡рд▓реА рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдИрдореЗрд▓ рднреЗрдЬрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪреЗрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗред

рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░рдгрдиреАрддрд┐ рдФрд░ рд╕рдордЧреНрд░ рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИрдВред

рд░рдгрдиреАрддрд┐ рдкреИрдЯрд░реНрди рдЙрджреНрджреЗрд╢реНрдп


рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ: рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдордЧреНрд░ рдкреИрдЯрд░реНрди рдЙрджреНрджреЗрд╢реНрдп


рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ: рдкреИрдЯрд░реНрди рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рде рдЖрджрд┐рдо рдФрд░ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рддреБрд░рдВрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рдЧрд┐рдЯрд╣рдм рд╕реНрд░реЛрдд

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рддрдп рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд▓рд┐рдВрдХрд░ рдХреЛ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
$composite = new \CompositeAndStrategy\CompositeStrategy( new \CompositeAndStrategy\CompositeStrategyAnd( new \CompositeAndStrategy\CompositeStrategyOr( new \CompositeAndStrategy\StrategyFirst(), new \CompositeAndStrategy\StrategySecond() ), new \CompositeAndStrategy\StrategyThird() ), new \CompositeAndStrategy\CompositeStrategyOr( new \CompositeAndStrategy\StrategyFourth(), new \CompositeAndStrategy\StrategyFifth() ) ); $result = $composite->perform(); 


рдирддреАрдЬрддрди, рд╣рдо рдПрдХ рдРрд╕реА рд░рдгрдиреАрддрд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реЛред рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо 2 рдореБрдЦреНрдп рдЬрдЯрд┐рд▓ рд░рдгрдиреАрддрд┐рдпрд╛рдБ рджреЗрдЦрддреЗ рд╣реИрдВ)

рд░рдгрдиреАрддрд┐ рдФрд░ рд▓рд┐рдВрдХрд░ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓рд┐рдВрдХрд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд░рдгрдиреАрддрд┐ рд╣реИ):
 namespace CompositeAndStrategy; interface IStrategy { function perform(); } 


рд▓рд┐рдВрдХрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЖрд╡рд╢реНрдпрдХ):
 namespace CompositeAndStrategy; interface ICompositeStrategy { function getAll(); function add(IStrategy $strategy); } 


рдЖрдЗрдП рдореВрд▓ рд▓рд┐рдВрдХрд░ рд▓рд┐рдЦреЗрдВ:
 namespace CompositeAndStrategy; class CompositeStrategy implements ICompositeStrategy, IStrategy { public function __construct() { $strategies = func_get_args(); if ($strategies) { foreach($strategies as $strategy) { if ($strategy instanceof IStrategy) { $this->add($strategy); } } } } /** * @var IStrategy[] */ protected $collection; /** * @param IStrategy $strategy */ public function add(IStrategy $strategy) { $this->collection[] = $strategy; } /** * @return IStrategy[] */ public function getAll() { return $this->collection; } /** * @return IStrategy */ public function perform() { foreach($this->getAll() as $strategy) { if ($strategy->perform()) { return $strategy; } } } } 

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реБрдЪрд┐ рдкреНрд░рджрд░реНрд╢рди () рд╡рд┐рдзрд┐ рд╣реЛрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд▓рд┐рдВрдХрд░ рдореЗрдВ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд░рдгрдиреАрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдЧрд▓рд╛, рд╣рдо рдКрдкрд░ рд▓рд╛рдЧреВ рд▓рд┐рдВрдХрд░ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╣рдо рд▓рд┐рдВрдХрд░ рд░рдгрдиреАрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкреВрд░реНрдг рдорд╛рдирддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрд╕рдХреА рд╕рднреА рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдЪрд╛рд▓рди "рдФрд░")ред
 namespace CompositeAndStrategy; class CompositeStrategyAnd extends CompositeStrategy { /** * @return bool|CompositeStrategyAnd */ public function perform() { foreach($this->getAll() as $strategy) { if (!$strategy->perform()) { return false; } } return $this; } } 

рдЕрдЧрд▓рд╛, рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рд╣рдо рд▓рд┐рдВрдХрд░ рд░рдгрдиреАрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрд╕рдХреА рдХрдо рд╕реЗ рдХрдо рдПрдХ рд░рдгрдиреАрддрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ (рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрд╢рди "рдУрдЖрд░")ред
 namespace CompositeAndStrategy; class CompositeStrategyOr extends CompositeStrategy { /** * @return CompositeStrategyOr */ public function perform() { foreach($this->getAll() as $strategy) { if ($strategy->perform()) { return $this; } } } } 


рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

рдкрд╣рд▓рд╛ рдФрд░ рдореБрдЦреНрдп:
 namespace CompositeAndStrategy; class StrategyFirst implements IStrategy { /** * @param $bool * @return mixed */ protected function drawLog($bool) { echo get_called_class().' - ' . (int)$bool.'<hr />'; return $bool; } /** * @return bool|StrategyFirst */ public function perform() { if ($operation = $this->drawLog(rand(0, 1))) { return $this; } return false; } } 


рдФрд░ 4 рдФрд░ рд░рдгрдиреАрддрд┐рдпрд╛рдБ:
 namespace CompositeAndStrategy; class StrategySecond extends StrategyFirst { } 

 namespace CompositeAndStrategy; class StrategyThird extends StrategyFirst { } 

 namespace CompositeAndStrategy; class StrategyFourth extends StrategyFirst { } 

 namespace CompositeAndStrategy; class StrategyFifth extends StrategyFirst { } 


рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд░рдгрдиреАрддрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧреАред
рдореИрдВ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ :)
рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рд╣реИ!

Source: https://habr.com/ru/post/In137190/


All Articles