php状态设计模式

Posted SHQHDMR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php状态设计模式相关的知识,希望对你有一定的参考价值。

状态设计模式的关键就是,环境中拥有所需的全部状态对象,每个状态对象又引用了环境对象;环境对象通过维护一个当前状态属性(用于存放状态对象)从而对所需的全部状态对象产生影响。

下面演示了一个简单的状态设计模式,状态设计模式的核心在于47-49行:

  1 <?php
  2 
  3 interface Status
  4 {
  5     function getProperty();
  6     function getContext();
  7 }
  8 
  9 abstract class BaseStatus implements Status
 10 {
 11     public $context;
 12 
 13     public function __construct(BaseContext $context)
 14     {
 15         $this->context = $context;
 16     }
 17 
 18     public function getContext()
 19     {
 20         return $this->context;
 21     }
 22 }
 23 
 24 abstract class BaseContext
 25 {
 26     public $currentStatus;
 27 
 28     public function changeStatus(Status $status)
 29     {
 30         $this->currentStatus = $status;
 31     }
 32 
 33     public function statusDetail()
 34     {
 35         return $this->currentStatus->getProperty();
 36     }
 37 }
 38 
 39 class Context extends BaseContext
 40 {
 41     public $status1;
 42     public $status2;
 43     public $status3;
 44 
 45     public function __construct()
 46     {
 47         $this->status1 = new Status1($this);
 48         $this->status2 = new Status2($this);
 49         $this->status3 = new Status3($this);
 50 
 51         $this->currentStatus = $this->status1;
 52     }
 53 }
 54 
 55 class Status1 extends BaseStatus
 56 {
 57     public function getProperty()
 58     {
 59         echo ‘I am status1‘.PHP_EOL;
 60         if ($this->getContext()->currentStatus instanceof self) {
 61             echo ‘here is status two and status three<br/>‘;
 62             $this->context->status2->getProperty();
 63             echo ‘<br/>‘;
 64             $this->context->status3->getProperty();
 65             echo ‘<br/>‘;
 66         }
 67     }
 68 }
 69 
 70 class Status2 extends BaseStatus
 71 {
 72     public function getProperty()
 73     {
 74         echo ‘I am status2‘.PHP_EOL;
 75         if ($this->getContext()->currentStatus instanceof self) {
 76             echo ‘here is status one and status three<br/>‘;
 77             $this->context->status1->getProperty();
 78             echo ‘<br/>‘;
 79             $this->context->status3->getProperty();
 80             echo ‘<br/>‘;
 81         }
 82     }
 83 }
 84 
 85 class Status3 extends BaseStatus
 86 {
 87     public function getProperty()
 88     {
 89         echo ‘I am status3‘.PHP_EOL;
 90         if ($this->getContext()->currentStatus instanceof self) {
 91             echo ‘here is status one and status two<br/>‘;
 92             $this->context->status1->getProperty();
 93             echo ‘<br/>‘;
 94             $this->context->status2->getProperty();
 95             echo ‘<br/>‘;
 96         }
 97     }
 98 }
 99 
100 $context = new Context();
101 
102 $context->statusDetail();
103 
104 $context->changeStatus($context->status2);
105 
106 $context->statusDetail();
107 
108 $context->changeStatus($context->status3);
109 
110 $context->statusDetail();

运行结果:

I am status1 here is status two and status three
I am status2 
I am status3 
I am status2 here is status one and status three
I am status1 
I am status3 
I am status3 here is status one and status two
I am status1 
I am status2 

可见,每次环境对象切换状态的时候,环境对象内的任何修改对于所有状态对象都是同步可见的(状态对象均引用了环境对象)。









以上是关于php状态设计模式的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

超级有用的9个PHP代码片段

PHP必用代码片段

PHP代码-psysh调试代码片段工具