个人理解:根据事物状态的不同,导致其行为的不同,切换状态,相应的行为也会发生变化
类图
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(); } }