PHP设计模式-状态 发表于 2017-04-04 | 分类于 PHP | 评论数: | 阅读次数: 本文字数: 4.2k | 阅读时长 ≈ 4 分钟 适用性 理解:行为随着状态变化 区别: 策略的改变由client完成,client持有context的引用;而状态的改变是由context或状态自己, 就是自身持有context 简单说就是策略是client持有context,而状态是本身持有context 使用场景:大量和对象状态相关的条件语句 下面我们来实现一个农民四季种菜 春季:玉米 夏季:黄瓜 秋季:白菜 冬季:菠菜 代码示例123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270/** * 农耕接口 */interface Farm{ /** * 种植 * * @return string */ function grow(); /** * 收割 * * @return string */ function harvest();}/** * 农耕接口 */class FarmAutumn implements Farm{ /** * 作物名称 * @var string */ private $_name = '白菜'; /** * 种植 * * @return string */ function grow() { echo "种植了一片 {$this->_name} \n"; } /** * 收割 * * @return string */ function harvest() { echo "收获了一片 {$this->_name} \n"; }}/** * 农耕接口 */class FarmSpring implements Farm{ /** * 作物名称 * @var string */ private $_name = '玉米'; /** * 种植 * * @return string */ function grow() { echo "种植了一片 {$this->_name} \n"; } /** * 收割 * * @return string */ function harvest() { echo "收获了一片 {$this->_name} \n"; }}/** * 农耕接口 */class FarmSummer implements Farm{ /** * 作物名称 * @var string */ private $_name = '黄瓜'; /** * 种植 * * @return string */ function grow() { echo "种植了一片 {$this->_name} \n"; } /** * 收割 * * @return string */ function harvest() { echo "收获了一片 {$this->_name} \n"; }}/** * 农耕接口 */class FarmWinter implements Farm{ /** * 作物名称 * @var string */ private $_name = '菠菜'; /** * 种植 * * @return string */ function grow() { echo "种植了一片 {$this->_name} \n"; } /** * 收割 * * @return string */ function harvest() { echo "收获了一片 {$this->_name} \n"; }}/** * 农民类 */class Farmer{ /** * 当前季节 * * @var string */ private $_currentSeason = ''; /** * 季节 * @var string */ private $_season = [ 'spring', 'summer', 'autumn', 'winter' ]; /** * 状态 * @var object */ private $_state; /** * 设置状态 * @param Farm $farm 种植方法 */ private function setState($currentSeason) { if ($currentSeason === 'spring') { $this->_state = new FarmSpring(); } if ($currentSeason === 'summer') { $this->_state = new FarmSummer(); } if ($currentSeason === 'autumn') { $this->_state = new FarmAutumn(); } if ($currentSeason === 'winter') { $this->_state = new FarmWinter(); } } /** * 设置下个季节状态 */ private function nextSeason() { $nowKey = (int)array_search($this->_currentSeason, $this->_season); if ($nowKey < 3) { $nextSeason = $this->_season[$nowKey+1]; }else{ $nextSeason = 'spring'; } $this->_currentSeason = $nextSeason; $this->setState($this->_currentSeason); } /** * 设置初始状态 */ function __construct($season = 'spring') { $this->_currentSeason = $season; $this->setState($this->_currentSeason); } /** * 种植 * * @return string */ function grow() { $this->_state->grow(); } /** * 收割 * * @return string */ function harvest() { $this->_state->harvest(); // 设置下一个季节状态 $this->nextSeason(); }}try { // 初始化一个农民 $farmer = new Farmer(); // 春季 $farmer->grow(); $farmer->harvest(); // 夏季 $farmer->grow(); $farmer->harvest(); // 秋季 $farmer->grow(); $farmer->harvest(); // 冬季 $farmer->grow(); $farmer->harvest();} catch (\Exception $e) { echo 'error:' . $e->getMessage();}