`
砺雪凝霜
  • 浏览: 156478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式——状态设计模式

阅读更多

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) 对象在某个方法里依赖于一重或多重的条件转移语句,其中大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里,这使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响系统的其它部分。
   
 
 
 
 
 
      
  • 大小: 35.1 KB
0
0
分享到:
评论

相关推荐

    设计模式——刘伟

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...

    设计模式——GFour

    《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...

    设计模式——原版的设计模式

    设计模式是一种在软件设计中被广泛认可的解决特定问题、经过良好记录并可重用的解决方案。它们代表了在各种编程环境中反复出现的问题的最佳实践。原版的设计模式通常指的是最初由“Gang of Four”(GoF)在他们的...

    设计模式——建造者模式

    建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...

    设计模式——单例

    设计模式是软件工程中的一种最佳实践,用于解决在不同场景下重复出现的问题。...通过阅读提供的"iOS 设计模式——单例"相关资料,可以深入理解在iOS开发环境中如何有效利用单例模式来优化代码结构和提高程序性能。

    Java设计模式——观察者模式

    首先,我们来看"Java设计模式——观察者模式的两种情况": 1. **主动通知**: 在这种情况下,被观察者对象在自身状态发生变化时,会主动调用`Observable`接口提供的`notifyObservers()`方法,将变化通知给所有注册的...

    设计模式——单例模式

    单例模式是软件设计模式中的一种经典模式,它在许多实际场景中被广泛使用,尤其在需要控制类的实例只有一个的情况下。单例模式确保无论在程序的任何地方,只要通过特定方式请求该类的实例,始终只会返回同一个对象。...

    软件设计模式——享元模式设计报告

    享元模式是一种软件设计模式,它的主要目的是为了提高性能,减少对象的创建,尤其是在大量相似对象需要被创建的情况下。在给定的咖啡店案例中,享元模式的应用可以帮助优化内存使用,避免为每杯咖啡的配料表分配独立...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    设计模式——策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或策略来执行不同操作的情况。策略模式允许我们将算法封装到独立的可互换的策略对象中,从而使算法的...

    设计模式实现——观察者模式

    在《设计模式实现——观察者模式》这篇博客中,作者可能详细解释了观察者模式的概念、结构以及其在实际编程中的应用。以下是对观察者模式的详细阐述: 1. **模式定义**:观察者模式是一种对象行为型模式,它允许...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    23种 设计模式---面向对象的基本原则

    设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,为软件开发提供了可复用的解决方案。在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计...

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    《设计模式》——图示符号指南

    对象图提供了更具体的信息,描绘了设计模式中对象在某一时刻的状态,关注于实例的结构而非类本身。对象图中的符号类似于类图,但更注重实例细节。每个对象由一个圆角矩形表示,对象名(格式为“aSomething”)与对象...

Global site tag (gtag.js) - Google Analytics