- 浏览: 176218 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
String.intern()在全局常量池1.8在native ...
Java 内存模型 -
lgh1992314:
try with resource
Java GC的过程 -
lgh1992314:
JDK8 HotSpot 方法区在MetaSpace
Java 内存模型 -
空城回转:
永洁童心 写道最后的图中,在afterload_1步骤中,op ...
栈帧、局部变量表、操作数栈 -
永洁童心:
最后的图中,在afterload_1步骤中,operand s ...
栈帧、局部变量表、操作数栈
1.定义
当一个对象内在状态改变时,允许其改变行为,这个对象看起来像改变了其类。
状态模式的核心是封装。
2.要解决的问题-过多的if-else状态判断
对象如何在每一种状态下表现出不同的行为?
在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接解决方案是将这些所有可能发生的情况全都考虑到。然后使用if... ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱。维护也会很麻烦。那么我就考虑只修改自身状态的模式。
例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,运行。每一种状态改变,都有可能要根据其他状态来更新处理。例如,开门状体,你不能在电梯处于运行状态的时候开门,而是在电梯处于静止状态下才能开门。
例子2:我们给一部手机打电话,就可能出现这几种情况:用户开机,用户关机,用户欠费停机,用户消户等。 所以当我们拨打这个号码的时候:系统就要判断,该用户是否在开机且不忙状态,又或者是关机,欠费等状态。但不管是那种状态我们都应给出对应的处理操作。
3.要点
- 策略模式和状态模式是双胞胎,它们有相同的类图,但是它们的意图不同。策略模式是围绕可以互换的算法来成功创建业务的,然而状态模式是通过改变对象内部的状态来帮助对象控制自己的行为.
- Context将与状态相关的操作委托给当前的Concrete State对象处理。
- Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context。
- Context或Concrete State类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。也就是说可以在State中保存对Concrete State的引用,在必要时设置具体的状态,做到状态的转换。
- 一般来讲,当状态转换是固定的时候,状态转换就适合放在Context中。然而,当转换是更动态的时候,通常会放到具体的状态类中进行。(具体状态类持有Context的引用,实现状态的转换) 。
状态模式类图:
4.状态模式的使用场景
- 行为随状态改变而改变的场景:这也是状态模式的根本出发点,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。
- 条件、分支判断语句的替代者:在程序中大量使用switch或者if-else判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式能很好的避免这一问题,它通过扩展子类实现了条件的判断处理。
下面请看状态模式的通用代码:
package _20StatePattern; /** * 抽象状态角色 */ public abstract class State { // 定义一个环境角色,供子类访问 protected Context context; public Context getContext() { return context; } public void setContext(Context context) { this.context = context; } // 行为1 public abstract void openDoor(); // 行为2 public abstract void closeDoor(); }
package _20StatePattern; /** * 开门状态 */ public class OpenDoorState extends State { @Override public void openDoor() { // 当前状态已经是开门了,再执行开门动作就不需要做任何事情 } @Override public void closeDoor() { // 将状态设置为关门状态 super.context.setCurrentState(Context.CloseState); // 执行关门动作 super.getContext().closeDoor(); System.out.println("状态:开门->关门"); } }
package _20StatePattern; /** * 关门状态 */ public class CloseDoorState extends State { @Override public void openDoor() { // 将状态设置为开门状态 super.context.setCurrentState(Context.OpenState); // 执行开门动作 super.getContext().openDoor(); System.out.println("状态:关门->开门"); } @Override public void closeDoor() { // 当前状态已经是关门了,再执行关门动作就不需要做任何事情 } }
package _20StatePattern; /** * 具体环境角色 */ public class Context{ // 定义状态 public final static State OpenState = new OpenDoorState(); public final static State CloseState = new CloseDoorState(); // 设置当前状态 private State currentState; public State getCurrentState() { return currentState; } public void setCurrentState(State currentState) { this.currentState = currentState; currentState.setContext(this); } public void openDoor() { this.currentState.openDoor(); } public void closeDoor() { this.currentState.closeDoor(); } }
package _20StatePattern; /** * 场景类 */ public class Client { public static void main(String[] args) { Context context = new Context(); // context.setCurrentState(Context.OpenState); // context.closeDoor(); context.setCurrentState(Context.CloseState); context.closeDoor(); } }
5.状态模式的优点
- 结构清晰:避免了过多的switch……case或者if……else语句,避免了程序的复杂性,提高系统的可维护性
- 遵循设计原则:很好的体现了开闭原则和单一职责原则,每个状态都是一个子类,你要增加状态就要增加子类,你要修改状态,只要修改一个子类就可以了
- 封装性非常好:这也是状态模式的基本要求,状态变换放置到类的内部实现,外部的调用不知道内部如何实现和行为的变换
6.状态模式的缺点
状态模式既然有优点,那当然有缺点了。那就是子类会太多,也就是类膨胀,如果一个事物有很多状态也不稀奇,如果完全使用状态模式就会有太多的子类,不好管理,这个需要使用者衡量。
7.状态模式的注意事项
状态模式适用于当某个对象在它的状态发生改变时,它的行为也随着发生比较大的变化,也就是说在行为受状态约束的情况下可以使用状态模式,而且使用时对象的状态不要超过5个。
发表评论
-
设计模式代码-仅供参考
2012-11-26 17:13 902学完设计模式,示例代码保存着,以后看看。 -
23.桥梁模式(Bridge Pattern)
2012-11-26 17:09 18951.定义 将抽象和实现解耦,使得两者可以独立地变化 ... -
22.享元模式(Flyweight Pattern)
2012-11-26 14:55 14941.定义 使用共享对象可有效地支持大量的细粒度的对象。 是 ... -
21.解析器模式(Interpreter Pattern)
2012-11-23 14:29 46541.定义 给定一门语言,定义它的文法的一种表示,并定义一个解 ... -
19.访问者模式(Visitor Pattern)
2012-11-19 16:28 2011话说有一个银行,有三 ... -
18.备忘录模式(Memento Pattern)
2012-11-16 15:01 1124引子 俗话说:世上难 ... -
17.门面模式(FacadePattern)
2012-11-15 15:23 10931.定义 要求一个子系统 ... -
16.观察者模式(ObserverPattern)
2012-11-14 16:08 15921.定义 定义对象之间一种一对多的依赖关系,使得每当一个对象 ... -
15.组合模式(Composite Pattern)
2012-11-13 17:35 18511.定义 将对象组合成树形结构以表示“部分-整体”的层次结构 ... -
14.迭代器模式(Iterator Pattern)
2012-11-13 14:27 12271.定义 提供一种方法访 ... -
13.适配器模式(Adapter Pattern)
2012-11-12 17:24 13951.定义 将一个类的接口变换成客户端所期待的另一种接口,从而 ... -
12.策略模式(Strategy Pattern)
2012-11-12 13:51 11621.定义 定义一组算法,将每个算法都封装起来,并且使它们之间 ... -
11.装饰模式(Decorator Pattern)
2012-11-08 15:57 10971.定义 动态地给一个对 ... -
10.责任链模式(Chain of Responsibility)
2012-11-07 16:15 11301.定义: 使多个对象都有机会处理请求,从而避免了请求的发送 ... -
9.命令模式(Command Pattern)
2012-11-07 14:45 10511.定义 将一个请求封装 ... -
8.中介者模式(Mediator Pattern)
2012-11-01 15:57 15861.定义: 用一个中介对象封装一系列的对象交互,中介者使个对 ... -
7.原型模式(Prototype Pattern)
2012-11-01 10:54 13851.定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原 ... -
6.代理模式(Proxy Pattern)
2012-10-30 16:09 11911.定义: 为其他对象提供一种代理以控制这个对象的访问。 ... -
5.建造者模式(Builder Pattern)
2012-10-26 17:06 10861.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构 ... -
4.模板方法模式(Template Method Pattern)
2012-10-25 16:33 1215定义: 定义一个操作中的算法的框架,而将一些步骤延迟到 ...
相关推荐
### 状态模式(State Pattern) #### 概念与定义 状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。该模式通过引入一个代表各种状态的类以及一个行为随着这些...
状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。在状态模式中,一个对象的状态变化会导致其行为的变化,这种变化不是通过改变对象的类来实现的,而是通过改变对象的状态。这个模式的核心是封装可能...
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype...23. 状态模式(State Pattern)
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator ... 状态模式(State Pattern)
状态模式-State Pattern状态模式-State Pattern【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互
C# 32种设计模式: 创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) ... 状态模式(State Pattern)
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式将一个对象的行为分解为各个独立的状态,并且每个状态都封装在自己的类中,使得对象在...
在《设计模式》实战---状态模式(State Pattern)这篇文章中,作者可能详细探讨了以下关键点: 1. **模式定义**:状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。这通过将每个状态封装...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且根据不同的状态,对象的行为也相应地变化。在C++中实现状态模式,我们...
在给定的“com.designpattern.state_observer.rar”压缩包中,我们可以期待找到有关“状态模式(State Pattern)”和“观察者模式(Observer Pattern)”的示例代码或教程。这两种模式都是行为设计模式,它们在处理...
在软件设计领域,状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个案例中,“基于state pattern实现的xml解释器”指的是一个XML解析器,该...
状态模式定义Allow an object to alter its behavior when its internal state changes. The
21. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为,使对象看起来似乎修改了其类。 通过学习和掌握这些设计模式,可以提高程序员的设计和编码能力,提高软件系统的灵活性、可维护性和可...
在“18-State.rar”文件中,我们可能找到了关于状态模式的具体应用实例或相关资料。 状态模式的核心思想是将对象的状态抽象出来,每个状态对应一个类,这些状态类都实现了相同的接口或继承自同一个基类,这样对象在...
15.状态模式State演示了如何根据对象的内部状态(属性值)来决定对象的行为,实现行为的动态切换。 9. **策略模式(Strategy Pattern)**:策略模式定义了一族算法,并将每个算法封装起来,使它们可以相互替换。14....
StatePattern.unitypackage是一个unity演示的状态模式。有需要的同学可以自行下载。
5. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。 6. 责任链模式(Chain of Responsibility Pattern):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。 7. ...
17. 状态模式(State Pattern):允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 18. 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它可以在不改变各元素的...
21. 状态模式(State Pattern):允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。 22. 模板方法模式(Template Method Pattern):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中...