设计模式(二十四)---状态模式

1、简介

  定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

  状态模式允许一个对象在其内部状态改变时改变其行为,这个对象看上去就像改变了他的类一样

2、状态模式类图

3、状态模式涉及到的角色

  从上图可以看出  状态模式涉及到以下几个角色

  3.1、抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为

  3.2、具体状态(ConcreteState)角色:每一个具体状态类都实现了环境的一个状态所对应的行为

  3.3、环境(Context)角色:环境角色持有一个状态类的实例,这个状态类的实例给出环境对象的现有状态

4、源代码

  4.1、抽象状态角色

package State;
/**
 * ********************************************************
* @ClassName: State
* @Description: 抽象状态接口
***********************************************************
 */
public interface State {
    String SimpleOperation();
}

  4.2、具体状态角色1

package State;
/**
 * ********************************************************
* @ClassName: ConcreteState
* @Description: 具体状态类
***********************************************************
 */
public class Sit implements State{

    @Override
    public String SimpleOperation() {
    return    "我坐下了";
    }

}

  4.3、具体状态角色2

package State;
/**
 * ********************************************************
* @ClassName: Stand
* @Description: 具体状态类
***********************************************************
 */
public class Stand implements State{

    @Override
    public String SimpleOperation() {
        return "我站起来了";
    }

}

  4.4、环境角色

package State;
/**
 * ********************************************************
* @ClassName: Context
* @Description:环境类 环境类持有一个State对象  并把所有的行为委派给此对象
***********************************************************
 */
public class Context {
    private State state;

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public String stateManage(){
        return state.SimpleOperation();
    }

}

  4.5、测试客户端

package State;
/**
 * ********************************************************
* @ClassName: Client
* @Description: 状态模式测试客户端
***********************************************************
 */
public class Client {

    public static void main(String[] args) {
        Context context = new Context();
        context.setState(new Sit());
        System.out.println(context.stateManage());
        context.setState(new Stand());
        System.out.println(context.stateManage());
    }
}

5、测试 运行结果如下

  

时间: 2024-11-18 09:30:05

设计模式(二十四)---状态模式的相关文章

设计模式之十四:备忘录模式(Memento)

备忘录模式: 在不破换封装性的前提下,捕获一个对象的内部状态并将这个状态保存到对象外部,这样这个对象之后可以恢复到保存的状态. Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later UML图: 主要包括: Memento(Memento):存储Originator的内部状态.

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

云计算设计模式(二十四)——仆人键模式

云计算设计模式(二十四)——仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接访问特定的资源或服务,以便由应用程序代码卸载数据传输操作.这个模式是在使用云托管的存储系统或队列的应用中特别有用,并且可以最大限度地降低成本,最大限度地提高可扩展性和性能. 背景和问题 客户端程序和网络浏览器经常需要读取和写入文件或数据流,并从一个应用程序的存储空间.通常,应用程序将处理的运动数据,或者通过从存储读取它,并将其传输到客户端,或通过从客户机读取该载流并将其存储在数据存储中.然而,这种方法吸收了宝贵的资

设计模式(十四):Command命令模式 -- 行为型模式

1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧

云计算设计模式(十四)——实体化视图模式

云计算设计模式(十四)——实体化视图模式 产生过在一个或多个数据存储中的数据预填充的观点时,数据被格式化以不利于所需的查询操作的一种方式.这种模式可以帮助支持高效的查询和提取数据,并提高应用程序的性能. 背景和问题 何时存储数据时,优先级为开发者和数据管理员经常集中在如何将数据存储,而不是它是如何读出.所选择的存储格式通常是密切相关的数据,用于管理数据的大小和数据的完整性,并且在使用的那种存储的要求的格式.例如,使用的NoSQL文献商店时,该数据通常被表示为一系列的聚集体,其每一个包含了所有的信

设计模式 ( 二十 ): Template method模板方法模式 -- 行为型

  1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作人员进行评分.取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ? 3.

24、蛤蟆的数据结构笔记之二十四串的模式匹配算法

24.蛤蟆的数据结构笔记之二十四串的模式匹配算法 本篇名言:"燧石受到的敲打越厉害,发出的光就越灿烂. -- 马克思" 来看下两个算法,BF和KMP算法在串的模式匹配中实现. 欢迎转载,转载请标明出处: 1.  BF算法 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.B

设计模式之十四:Decorator(装饰)—对象结构型模式

2014-06-15 星期日 10:42:12  Decorator,继续GOF. 1.Intent Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality 动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活. 2.A

实验二十四:SD卡模块

  驱动SD卡是件容易让人抓狂的事情,驱动SD卡好比SDRAM执行页读写,SD卡虽然不及SDRAM的麻烦要求(时序参数),但是驱动过程却有猥琐操作.除此此外,描述语言只要稍微比较一下C语言,描述语言一定会泪流满面,因为嵌套循环,嵌套判断,或者嵌套函数等都是它的痛.. 史莱姆模块是多模块建模的通病,意指结构能力非常脆弱的模块,暴力的嵌套行为往往会击垮模块的美丽身躯,好让脆弱结构更加脆弱还有惨不忍睹,最终搞垮模块的表达能力.描述语言预想驾驭SD卡,关键的地方就是如何提升模块的结构能力.简单而言,描述

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述