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状态设计模式的主要内容,如果未能解决你的问题,请参考以下文章