Я читал о шаблонах проектирования состояния и стратегии на веб-сайте refactoring.guru на страницах Состояние и Стратегия а>. Автор говорит
Эта структура может выглядеть похожей на шаблон «Стратегия», но есть одно ключевое отличие. В шаблоне State отдельные состояния могут знать друг о друге и инициировать переходы из одного состояния в другое, тогда как стратегии почти никогда не знают друг о друге.
Автор также говорит, что классы ConcereteState
хранят переменную context
, которая является объектом класса Context
, и с помощью этой переменной состояния могут узнавать друг о друге.
Я не могу понять две вещи:
- Как государство знает о своем предшественнике?
- Где мне реализовать логику перехода между состояниями? Например
state1
по вводуa
переходит вstate2
а поb
переходит вstate4
, где именно должна быть реализована эта логика?
Это простая реализация стратегии, которую я реализовал на языке php.
<?php
class Algorithms{
public $algorithm;
function __construct(AlgorithmsInterface $algorithm){
$this->algorithm = $algorithm;
}
public function run(){
$this->algorithm->run();
}
}
interface AlgorithmsInterface{
public function run();
}
class Algorithm1 implements AlgorithmsInterface{
public function run(){
print "Algorithm1";
}
}
class Algorithm2 implements AlgorithmsInterface{
public function run(){
print "Algorithm2";
}
}
$payment = new Algorithms(new Algorithm2());
$payment->run();
и это простая реализация шаблона проектирования State, который я реализовал
<?php
interface State{
public function execute();
}
class Context{
public $state;
public function __construct(State $initialState){
$this->state = $initialState;
}
public function changeState(State $state){
$this->state = $state;
}
public function execute(){
$this->state->execute();
}
}
class State1 implements State{
public function execute(){
print "This is State1";
}
}
class State2 implements State{
public function execute(){
print "This is State2";
}
}
$initialState = new State1();
$state2 = new State2();
$context = new Context($initialState);
$context->execute();
$context->changeState($state2);
$context->execute();
?>
Я не вижу большой разницы между состоянием и стратегией, хотя я точно знаю, каковы цели этих стратегий. Кроме того, в коде отсутствует логика перемещения между состояниями и то, как состояние должно знать своего родителя.