statemode的状态模式其实从字面上看不太好理解。这里的状态是什么意思?保存状态?那不是备忘录模式。其实这里的状态就是类的状态。通过改变班级的某种状态,班级感觉就像一个不同的班级。说起来有点啰嗦,还是先学习概念再看吧。Gof类图及解释GoF定义:允许一个对象在其内部状态改变时改变其行为。该对象似乎修改了其GoF类图代码实现类Context{private$state;publicfunctionSetState(State$state):void{$this->state=$state;}publicfunctionRequest():void{$this->state=$this->state->Handle();}}一个上下文类,也可以看作是一个目标类,里面有一个状态对象。在调用Request()时,调用状态类的Handle()方法。目的是当前上下文类的状态变化由外部状态类操纵。interfaceState{publicfunctionHandle():State;}classConcreteStateAimplementsState{publicfunctionHandle():State{echo'当前处于状态A',PHP_EOL;返回新的ConcreteStateB();}}classConcreteStateBimplementsState{publicfunctionHandle():State{echo'当前处于状态B',PHP_EOL;返回新的ConcreteStateA();}}抽象状态接口和两个具体实现。这两个具体实现实际上是在互相调用。实现的效果是每次上下文类调用Request()方法时,内部状态类就变成另一个状态。它就像一个开关,在开和关之间来回切换。$c=newContext();$stateA=newConcreteStateA();$c->SetState($stateA);$c->Request();$c->Request();$c->Request();$c->请求();客户端的实现实例化上下文对象并设置初始状态,然后通过不断调用Request()对象来切换开关状态。你看见路了吗?在这里,状态变化被封装到外部实现类中,而不是上下文或目标类来切换状态。那么状态模式是什么意思呢?这个默认类图的例子太简单了。其实状态模式的真正目的是为了解决复杂的if嵌套问题。将复杂的if嵌套条件一一放入外部状态类中进行判断。在下面的例子中我们会看到它适用于:一个对象的行为取决于它的状态,它必须在运行时根据状态改变它的行为;一个操作包含大量的多分支条件语句,而这些分支依赖于对象的状态State;状态模式的特点是:将与特定状态相关的行为局部化;它使状态转换明确;在发生各种状态变化时,可以利用状态模型进行整体设计和架构。我们在手机系统中定制了自己的商城系统,可以在手机上方便的下单购买我们的产品。一个订单(Context)有多个状态(State),比如未付款、已付款、订单已完成、订单退款等等很多状态。我们把这些状态放在对应的状态类中去实现,不同的状态类会调用状态的下一步动作,比如付款后等待收货,退货号后等待买家填写物流单。这样,状态模式在我们商城灵活运用!!完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php您可以享受的折扣,此时,您可以使用状态模型轻松获得会员级别的折扣。当然,最重要的是,当您需要添加或删除会员级别时,您只能在使用状态模式时添加相应的会员折扣状态子类。其他业务代码不用改,下面看具体实现!会员折扣图完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state-member.phpstate=$state;}publicfunctionSetScore($score){$this->score=$score;}publicfunctionGetScore(){return$this->score;}publicfunctiondiscount(){return$this->state->discount($this);}}interfaceState{publicfunctiondiscount($member);}classPlatinumMemeberStateimplementsState{publicfunctiondiscount($member){if($member->GetScore()>=1000){返回0.80;}else{$member->SetState(newGoldMemberState());返回$member->discount();}}}classGoldMemberState实现状态{publicfunctiondiscount($member){if($member->GetScore()>=800){返回0.85;}else{$member->SetState(newSilverMemberState());返回$member->discount();}}}classSilverMemberStateimplementsState{publicfunctiondiscount($member){if($member->GetScore()>=500){返回0.90;}else{$member->SetState(newGeneralMemberState());返回$member->discount();}}}classGeneralMemberStateimplementsState{publicfunctiondiscount($member){return0.95;}}$m=newMember();$m->SetState(newPlatinumMemeberState());$m->SetScore(1200);echo'当前成员'.$m->GetScore()。'积分,折扣为:'。$m->discount(),PHP_EOL;$m->SetScore(990);echo'currentmember'。$m->GetScore()。'积分,折扣为:'。$m->discount(),PHP_EOL;$m->SetScore(660);echo'currentmember'。$m->GetScore()。'积分,折扣为:'。$m->discount(),PHP_EOL;$m->SetScore(10);echo'currentmember'。$m->锗分数()。'积分,折扣为:'。$m->discount(),PHP_EOL;表示如果不使用state模式,我们可能需要在Member的discount()方法中写很多层if...else。..判断条件同时,这也带来了方法经验越来越长,越来越难维护的问题。状态模式就是为了解决这个问题而存在的。当discount()行为的结果依赖于会员对象本身的状态(会员积分)时,状态模型是最好的选择,即一个对象的行为依赖于它的状态,如前所述,如果...else...更直观,大多数日常应用中的状态一般很少修改或添加。如果你的订单状态需要经常修改或者添加,那一定是架构设计有问题。但是,通过对这个模式的学习,我们看到了面向对象在处理这类问题上的威力。这就是我们学习设计模式,灵活恰当的使用,加深对面向对象的理解的最终目的。那么最后一个设计模式就要出现了,就是访客模式。各媒体平台均可搜索【硬核项目经理】
