福州网站建设外贸,文山做网站的地方,长宁区网站建设设计,wordpress 适合程序员主题23种计模式之 前言 #xff08;5#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、#xff08;11#xff09;策略模式、责任链模式、命令模式、中介者模…23种计模式之 前言 5单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、11策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 设计原则
22-Python与设计模式–状态模式
一、电梯控制器
电梯在我们周边随处可见电梯的控制逻辑中心是由电梯控制器实现的。电梯的控制逻辑即使简单点设计
把状态分成开门状态停止状态和运行状态操作分成开门、关门、运行、停止那流程也是很复杂的。
首先开门状态不能开门、运行、停止停止状态不能关门停止运行状态不能开门、关门、运行。
要用一个一个if…else…实现首先代码混乱不易维护二是不易扩展。至于各种设计原则什么的……
那该如何实现在上边的逻辑中每个操作仅仅是一个操作状态切换与操作是分离的这也造成后来操作和
状态“相互配合”的“手忙脚乱”。如果把状态抽象成一个类每个状态为一个子类每个状态实现什么操作
不实现什么操作仅仅在这个类中具体实现就可以了。
下面我们实现这个逻辑。先实现抽象的状态类
class LiftState:def open(self):passdef close(self):passdef run(self):passdef stop(self):pass而后实现各个具体的状态类
class OpenState(LiftState):def open(self):print OPEN:The door is opened...return selfdef close(self):print OPEN:The door start to close...print OPEN:The door is closedreturn StopState()def run(self):print OPEN:Run Forbidden.return selfdef stop(self):print OPEN:Stop Forbidden.return self
class RunState(LiftState):def open(self):print RUN:Open Forbidden.return selfdef close(self):print RUN:Close Forbidden.return selfdef run(self):print RUN:The lift is running...return selfdef stop(self):print RUN:The lift start to stop...print RUN:The lift stopped...return StopState()
class StopState(LiftState):def open(self):print STOP:The door is opening...print STOP:The door is opened...return OpenState()def close(self):print STOP:Close Forbiddenreturn selfdef run(self):print STOP:The lift start to run...return RunState()def stop(self):print STOP:The lift is stopped.return self为在业务中调度状态转移还需要将上下文进行记录需要一个上下文的类。
class Context:lift_statedef getState(self):return self.lift_statedef setState(self,lift_state):self.lift_statelift_statedef open(self):self.setState(self.lift_state.open())def close(self):self.setState(self.lift_state.close())def run(self):self.setState(self.lift_state.run())def stop(self):self.setState(self.lift_state.stop())这样在进行电梯的调度时只需要调度Context就可以了。业务逻辑中如下所示
if __name____main__:ctx Context()ctx.setState(StopState())ctx.open()ctx.run()ctx.close()ctx.run()ctx.stop()打印如下 STOP:The door is opening… STOP:The door is opened… OPEN:Run Forbidden. OPEN:The door start to close… OPEN:The dorr is closed STOP:The lift start to run… RUN:The lift start to stop… RUN:The lift stopped… 由逻辑中可知电梯先在STOP状态然后开门开门时运行Run被禁止然后关门、运行、停止。二、状态模式
状态模式的定义如下当一个对象内在状态改变时允许其改变行为这个对象看起来像改变了其类。三、状态模式的优点和应用场景
优点
1、状态模式的优点是结构清晰相比于if…else…简约了不少
2、封装性好外部调用不必知道内部实现细节。应用场景
1、行为状态改变的场景。这点在各种控制器中非常常见同时逻辑结构为状态转移图的场景中都非常适用。
四、状态模式的缺点
1、在状态比较多时子类也会非常多不便于管理。