| |
| class State |
| { |
| private $stateCode; |
| |
| public function __construct(String $stateCode) |
| { |
| $this->stateCode = $stateCode; |
| |
| } |
| |
| public function getStateCode() |
| { |
| return $this->stateCode; |
| } |
| } |
| |
| |
| class Event |
| { |
| private $eventCode; |
| private $parameters = []; |
| |
| public function __construct(String $eventCode, array $parameters = []) |
| { |
| $this->eventCode = $eventCode; |
| $this->parameters = $parameters; |
| } |
| |
| public function getEventCode() |
| { |
| return $this->eventCode; |
| } |
| |
| public function getParameters() : array{ |
| return $this->parameters; |
| } |
| } |
| |
| |
| abstract class AbstractTransition |
| { |
| protected $currentState; |
| protected $nextState; |
| |
| public function __construct(State $currentState, State $nextState) |
| { |
| $this->currentState = $currentState; |
| $this->nextState = $nextState; |
| } |
| |
| |
| protected abstract function subHandle(Event $event) : bool; |
| |
| |
| public function handle(Event $event) |
| { |
| if ($this->subHandle($event)) { |
| return $this->nextState; |
| } |
| |
| echo 'throw new Exception 抛错'; |
| } |
| } |
| |
| |
| abstract class AbstractStateMachine |
| { |
| protected abstract function getStateEventTransitionMap() : array; |
| |
| protected function getTransition(String $stateCode, String $eventCode) |
| { |
| $stateEventTransitionMap = $this->getStateEventTransitionMap(); |
| |
| $eventTransitionMap = $stateEventTransitionMap[$stateCode] ?? []; |
| |
| $transition = $eventTransitionMap[$eventCode] ?? []; |
| |
| return $transition; |
| } |
| |
| public function handle(String $stateCode, Event $event) |
| { |
| $eventCode = $event->getEventCode(); |
| |
| if ($transition = $this->getTransition($stateCode, $eventCode)) { |
| return $transition->handle($event); |
| } |
| |
| echo 'throw new Exception 抛错'; |
| } |
| } |
| |
| |
| class OrderEventCode { |
| const PAY = "支付订单"; |
| const CANCEL = "取消订单"; |
| } |
| |
| |
| class OrderStateCode { |
| const UNPAID = "待支付"; |
| const PAID = "已支付"; |
| const CANCELED = "已取消"; |
| } |
| |
| |
| class PayTransition extends AbstractTransition |
| { |
| protected function subHandle(Event $event) : bool{ |
| var_dump('支付订单', $event->getParameters()); |
| return true; |
| } |
| } |
| |
| |
| class OrderStateMachine extends AbstractStateMachine |
| { |
| public function getStateEventTransitionMap() : array{ |
| return [ |
| OrderStateCode::UNPAID => [ |
| OrderEventCode::PAY => new PayTransition( |
| new State(OrderStateCode::UNPAID), new State(OrderStateCode::PAID) |
| ), |
| ], |
| ]; |
| } |
| |
| public function pay() |
| { |
| $event = new Event(OrderEventCode::PAY, ['order_id' => 1]); |
| |
| $this->handle(OrderStateCode::UNPAID, $event); |
| } |
| } |
| |
| |
| $stateMachine = new OrderStateMachine(); |
| $stateMachine->pay(); |