UML图
定义:(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景:当一个对象改变了状态,会影响这个对象能执行的行为。比如当我们灯控制开关,有两个行为:一个是开的行为,一个是关的行为。当灯是开的状态,只能执行关的行为;当灯是关的状态,只能执行开的行为。这个时候状态是改变了灯这个对象的行为的。
具体的代码实现:
//开关状态抽象接口 State.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/3/23
* Time: 14:34
*/
abstract class State
{
public abstract function getState();
public abstract function turnOn(OnOff $onOff);
public abstract function turnOff(OnOff $onOff);
}
//开状态具体实现接口 OnState.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/3/23
* Time: 14:43
*/
class OnState extends State
{
public function getState()
{
echo "当前状态为开\n";
}
public function turnOn(OnOff $onOff)
{
echo "当前状态为开状态,不能进行开操作\n";
}
public function turnOff(OnOff $onOff)
{
echo "已关\n";
$onOff->setState(new OffState());
}
}
//关状态具体实现接口 OffState.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/3/23
* Time: 14:43
*/
class OffState extends State
{
public function getState()
{
echo "当前状态为关\n";
}
public function turnOn(OnOff $onOff)
{
echo "已开\n";
$onOff->setState(new OnState());
}
public function turnOff(OnOff $onOff)
{
echo "当前状态为关状态,不能进行关操作\n";
}
}
//开关控制类 OnOff.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/3/23
* Time: 14:34
*/
class OnOff
{
public $state;
public function getState()
{
return $this->state->getState();
}
public function setState(State $state)
{
$this->state = $state;
}
public function turnOn()
{
$this->state->turnOn($this);
}
public function turnOff()
{
$this->state->turnOff($this);
}
}
//入口文件 Main.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/3/23
* Time: 14:51
*/
require_once 'AutoLoader.php';
spl_autoload_register('AutoLoader::AutoLoadClass');
header('Content-type:text/html;charset=utf8');
$onState = new OnState();
$onOff = new OnOff();
$onOff->setState($onState);
$onOff->getState();
$onOff->turnOn();
//echo "<pre>";
//var_dump($onOff);
$onOff->turnOff();
//var_dump($onOff);
$onOff->turnOn();
//var_dump($onOff);
//类自动加载类 AutoLoader.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/3/23
* Time: 10:19
*/
class AutoLoader
{
public static $classMap = [];
public static function AutoLoadClass($class)
{
if(isset(self::$classMap[$class])) {
return true;
}
$file = $class.'.php';
if(file_exists($file)) {
include $file;
self::$classMap[$class] = $class;
}
}
}