个人理解:根据事物状态的不同,导致其行为的不同,切换状态,相应的行为也会发生变化
类图
php实现
abstract class Status
{
protected $context;
public function setContext($context)
{
$this->context = $context;
}
public abstract function handle1();
public abstract function handle2();
}
class ConcreateStatus1 extends Status
{
public function handle1()
{
echo 'ConcreateStatus1 handle1';
}
public function handle2()
{
$this->context->setCurrentStatus($this->context->concreteStatus2);
$this->context->handle2();
}
}
class ConcreateStatus2 extends Status
{
public function handle1()
{
$this->context->setCurrentStatus($thisi->context->concreteStatus1);
$this->context->handle1();
}
public function handle2()
{
echo 'ConcreateStatus2 handle2';
}
}
class Context
{
public $concreteStatus1;
public $concreteStatus2;
private $currentStatus;
public function setCurrentStatus($status)
{
$this->currentStatus = $status;
$this->currentStatus->setContext($this);
}
public function __construct()
{
$this->concreteStatus1 = new ConcreateStatus1();
$this->concreteStatus2 = new ConcreateStatus2();
}
public function handle1()
{
$this->currentStatus->handle1();
}
public function handle2()
{
$this->currentStatus->handle2();
}
}
$context = new Context();
$context->setCurrentStatus(new ConcreateStatus1());
$context->handle1();
$context->handle2();
java实现
public abstract class Status {
protected Context context;
public void setContext(Context context){
this.context = context;
}
public abstract void handle1();
public abstract void handle2();
}
public class ConcreteStatus1 extends Status {
@Override
public void handle1() {
System.out.print("1");
}
@Override
public void handle2() {
context.setCurrentStatus(Context.concreteStatus2);
context.handle2();
}
}
public class ConcreteStatus2 extends Status {
@Override
public void handle1() {
context.setCurrentStatus(Context.concreteStatus1);
context.handle2();
}
@Override
public void handle2() {
System.out.print("2");
}
}
public class Context {
public final static ConcreteStatus1 concreteStatus1 = new ConcreteStatus1();
public final static ConcreteStatus2 concreteStatus2 = new ConcreteStatus2();
public Status currentStatus;
public void setCurrentStatus(Status status){
currentStatus = status;
currentStatus.setContext(this);
}
public void handle1(){
currentStatus.handle1();
}
public void handle2(){
currentStatus.handle2();
}
}