1 概念
状态模式又称为状态对象模式,状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类
一样。
2 状态模式的结构
状态模式把所有研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
模式所涉及的角色有:
- 抽象状态(State)角色:定义一个接口,用以封装环境(context)对象的一个特定转态所对应的行为。
- 具体状态(ConcreteState)角色:每一个具体状态类都实现了环境的一个状态所对应的行为。
- 环境(context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
在上图可以看出,环境类Context是所考察的类,而它的行为方法是委派给类型为state的一个对象的。由于State本身是一个抽象类的接口,实际担当此任务的是具体状态类,即ConcreteState。上图只给出了一个具体的状态类,而实际情况中会有很多具体状态的类的。换而言之,环境类Context的行为operation()是委派给某一个具体状态类的。
通过使用多态性原则,可以动态的改变环境类Context的属性 State的内容,使其从指向一个具体状态类变换到指向另一个具体状态类,从而使环境类的行为operation()由不同的具体状态类来执行。
3 实例
Context类(环境):
publicclassContext{ privateState state; publicvoid operation(){ state.operation(); } publicvoid setState(State state){ this.state = state; } }
上面就是环境角色的源代码,可以看出,环境类持有一个State对象,并把所有的行为委派给此对象。
State接口(抽象状态):
publicinterfaceState{ publicvoid operation(); }
这个接口规范所有实现此接口的子类,要求它们都实现方法operation()
concreteState(具体状态类):
publicclassConcereteStateimplementsState{ publicvoid operation(){...} }
4 状态模式的效果
(1) 状态模式需要对每一个系统可能取得的状态创立一个状态类(State)的子类。当系统的状态发生变化时,系统便改变所选的子类。所有与一个特定状态有关的行为都被包装到一个特定的对象里,使得行为的定义局部化。因为同样的原因,如果有新的状态对应的行为需要定义时,可以很方便的通过设立新的子类的方式加到系统里,不需要改动其它的类。
(2) 由于每一个状态都被包装到了类里,就可以不必采用过程性的处理方式,使用大量的if-else判断语句。
(3) 使用状态模式使系统状态的变化变得很明显。由于不用一些属性(内部变量)来指明系统所处的状态,因此就不用担心担心修改这些属性不当而造成的错误。
(4) 状态模式的缺点是会造成大量的小的状态类,有点是使程序免于大量的条件转移语句,使程序更易于维护。
(5) 系统所选的状态子类均是从一个抽象状态类或接口继承而来,java语言的特性使得在java语言中使用状态模式较为安全。多态性则是状态模式的核心。
5 使用场景
(1) 一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变
(2) 对象在某个方法里依赖于一重或多重的条件转移语句,其中大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里,这使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响系统的其它部分。
相关推荐
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...
《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...
设计模式是一种在软件设计中被广泛认可的解决特定问题、经过良好记录并可重用的解决方案。它们代表了在各种编程环境中反复出现的问题的最佳实践。原版的设计模式通常指的是最初由“Gang of Four”(GoF)在他们的...
建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...
设计模式是软件工程中的一种最佳实践,用于解决在不同场景下重复出现的问题。...通过阅读提供的"iOS 设计模式——单例"相关资料,可以深入理解在iOS开发环境中如何有效利用单例模式来优化代码结构和提高程序性能。
首先,我们来看"Java设计模式——观察者模式的两种情况": 1. **主动通知**: 在这种情况下,被观察者对象在自身状态发生变化时,会主动调用`Observable`接口提供的`notifyObservers()`方法,将变化通知给所有注册的...
单例模式是软件设计模式中的一种经典模式,它在许多实际场景中被广泛使用,尤其在需要控制类的实例只有一个的情况下。单例模式确保无论在程序的任何地方,只要通过特定方式请求该类的实例,始终只会返回同一个对象。...
享元模式是一种软件设计模式,它的主要目的是为了提高性能,减少对象的创建,尤其是在大量相似对象需要被创建的情况下。在给定的咖啡店案例中,享元模式的应用可以帮助优化内存使用,避免为每杯咖啡的配料表分配独立...
"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...
### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或策略来执行不同操作的情况。策略模式允许我们将算法封装到独立的可互换的策略对象中,从而使算法的...
在《设计模式实现——观察者模式》这篇博客中,作者可能详细解释了观察者模式的概念、结构以及其在实际编程中的应用。以下是对观察者模式的详细阐述: 1. **模式定义**:观察者模式是一种对象行为型模式,它允许...
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,为软件开发提供了可复用的解决方案。在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计...
在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
对象图提供了更具体的信息,描绘了设计模式中对象在某一时刻的状态,关注于实例的结构而非类本身。对象图中的符号类似于类图,但更注重实例细节。每个对象由一个圆角矩形表示,对象名(格式为“aSomething”)与对象...