`
zhangweieye
  • 浏览: 9747 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式学习笔记(十七:状态模式)

 
阅读更多

1.1概述

    允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。这就是状态模式的定义。

    一个对象的状态依赖于它的变量的取值情况,对象在不同的运行环境中,可能具有不同的状态。在许多情况下,对象调用方法所产生的行为效果依赖于它当时的状态。

  例如,一个温度计(Thermometer)类的实例:温度计类通过调用方法showMessage()显示有关信息时,需要根据当前自己温度(temperature)变量的值来显示有关信息,即根据自己的状态来决定showMessage()方法所体现的具体行为,这就要求showMessage()方法中有许多条件分支语句,例如:

复制代码
public void showMessage(){
    if(temperature <= -20){
        System.out.println("现在是低温"+temperature);
     }
    if(temperature >= 30){
        System.out.println("现在是高温"+temperature);
    }
}
复制代码

  我们注意到showMessage()方法的行为依赖于temperature的大小,这就使Thermometer类的实例在应对需求变化时缺乏弹性,不能很好地满足用户的需求。例如,有些用户可能需要温度计当其temperature的值大于60显示某些重要的信息;有些用户当其温度temperature的值在1825之间显示重要的信息。显然为达到上述要求,必须修改上面的代码才可以满足用户需求,者显然不是人们喜欢做的。

  现在我们需要重新考虑温度计(Thermometer)类的设计,发现温度计类中因用户需求变化而需要修改的代码都和对象的状态有关,即与温度的大小有关,因此,按照面向抽象、不面向实现的设计原则,应当将对象的状态从当前对象中分离出去,即将一个对象的状态封装在另外一个类中。现在,设计一个抽象类:TemperatureState类,该类规定了显示和温度有关的信息的方法showTemperature()。具体类关系图如下图一所示:

 

 

图一:封装对象的状态

    Thermometer类包含ThermometerState类声明的若干个变量,表面Thermometer类的实例:温度计类可以将任何温度计状态类的子类的实例作为自己的状态,而且温度计类的实例可以把和状态有关的请求委派给所维护状态的对象。

    状态模式的关键是将对象的状态封装成为独立的类,对象调用方法时,可以委托当前对象所具有的状态调用相应的方法,是当前对象看起来好像修改了它的类。

 

1.2模式的结构

状态模式包括以下三种角色:

(1)环境(Context):环境是一个类,该类含有抽象状态(State)声明的变量,可以引用任何具体状态类的实例。用户对该环境(Context)类的实例在某种状态下的行为感兴趣。

(2)抽象状态(State):抽象状态是一个接口或抽象类。抽象状态中定义了与环境(Context)的一个特定状态相关的若干个方法。

(3)具体状态(Concrete State):具体状态是实现(扩展)抽象状态(抽象类)的实例。

状态模式结构的类图如下图二所示:

 

 

图二:状态模式的类图

 

 

1.3状态模式的优点

1)使用一个类封装对象的一种状态,很容易增加新的状态。

2)在状态模式中,环境(Context)中不必出现大量的条件判断语句。环境(Context)实例所呈现的状态变得更加清晰、容易理解。

3)使用状态模式可以让用户程序很方便地切换环境实例的状态。

4)使用状态模式不会让环境的实例中出现内部状态不一致的情况。

5)当状态对象没有实例变量时,环境的各个实例可以共享一个状态对象。

 

1.4适合使用状态模式的情景

1)一个对象的行为依赖于它的状态,并且它必须在运行时根据状态改变它的行为。

2)需要编写大量的条件分支语句来决定一个操作的行为,而且这些条件恰好表示对象的一种状态。

分享到:
评论

相关推荐

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记

    设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    C#设计模式学习笔记

    C#设计模式学习笔记是一份详尽的资源,适合任何希望深入了解如何在C#编程中应用设计模式的开发者。这份笔记涵盖了多种设计模式,旨在提升代码的可读性、可维护性和可扩展性,这些都是软件开发中至关重要的要素。 ...

    java设计模式学习笔记,以及各种模式的代码实现

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。这些模式是面向对象编程中的一种最佳实践,通过标准化的方式处理常见的设计问题。下面...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    尚硅谷设计模式源码笔记课件.zip

    行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    Head.First 设计模式学习笔记.pdf

    ### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...

    根据《JAVA与设计模式》整理的笔记及示例代码

    6. 状态模式:允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 7. 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 8. 访问者模式:表示一个作用于某对象结构中的各...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    设计模式笔记

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。

    图解java设计模式_学习笔记_java开发

    这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    图解设计模式 ,结城浩著 学习笔记

    根据给定的信息“图解设计模式,结城浩著学习笔记”,我们可以推断出这份文档主要涉及了设计模式的学习和理解。《图解设计模式》是一本由日本著名程序员结城浩撰写的书籍,该书以图形化的方式深入浅出地讲解了软件...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助开发者理解如何使用观察者模式来构建可扩展的系统。通过实际的代码示例,我们可以更深入地掌握这一模式,并将其应用到日常开发中,提升代码的...

Global site tag (gtag.js) - Google Analytics