一、什么是状态模式

  State模式也叫状态模式,是行为设计模式的 一种。State模式允许通过改变对象的内部状态 而改变对象的行为,这个对象表现得就好像修改 了它的类一样。

二、状态模式的应用场景

  状态模式主要解决的是当控制一个对象状态转 换的条件表达式过于复杂时的情况。把状态的判 断逻辑转译到表现不同状态的一系列类当中,可 以把复杂的判断逻辑简化。

三、状态模式的结构

四、状态模式的角色和职责

  Context:用户对象 拥有一个State类型的成员,以标识对象的当前 状态;

  State:接口或基类 封装与Context的特定状态相关的行为;

  ConcreteState:接口实现类或子类 实现了一个与Context某个状态相关的行为。

  1. public class Person {
  2. private int hour;
  3.  
  4. public int getHour() {
  5. return hour;
  6. }
  7.  
  8. public void setHour(int hour) {
  9. this.hour = hour;
  10. }
  11.  
  12. public void doSomething(){
  13. if(hour == 7) {
  14. System.out.println("吃早餐");
  15. } else if(hour == 12) {
  16. System.out.println("吃中饭");
  17. } else if(hour == 18) {
  18. System.out.println("吃晚饭");
  19. } else {
  20. System.out.println(hour + "未定义");
  21. }
  22. }
  23. }
  1. public class MainClass {
  2. public static void main(String[] args) {
  3. Person person = new Person();
  4.  
  5. person.setHour(7);
  6. person.doSomething();
  7.  
  8. person.setHour(12);
  9. person.doSomething();
  10.  
  11. person.setHour(18);
  12. person.doSomething();
  13.  
  14. person.setHour(8);
  15. person.doSomething();
  16. }
  17. }

=================================================================

使用状态模式

  1. public class Person {
  2. private int hour;
  3. private State state;
  4.  
  5. public int getHour() {
  6. return hour;
  7. }
  8.  
  9. public void setHour(int hour) {
  10. this.hour = hour;
  11. }
  12.  
  13. public void doSomething(){
  14. if(hour == 7) {
  15. state = new MState();
  16. state.doSomething();
  17. } else if(hour == 12) {
  18. state = new LState();
  19. state.doSomething();
  20. } else if(hour == 18) {
  21. state = new SState();
  22. state.doSomething();
  23. } else {
  24. state = new NoState();
  25. state.doSomething();
  26. }
  27. }
  28. }

状态  抽象

  1. public abstract class State {
  2. public abstract void doSomething();
  3. }

吃早餐

  1. public class MState extends State {
  2.  
  3. public void doSomething() {
  4. System.out.println("吃早餐");
  5. }
  6. }

吃中午饭

  1. public class LState extends State{
  2.  
  3. public void doSomething() {
  4. System.out.println("吃中饭");
  5. }
  6. }

吃晚饭

  1. public class SState extends State {
  2.  
  3. public void doSomething() {
  4. System.out.println("吃晚饭");
  5. }
  6. }

未定义

  1. public class NoState extends State {
  2.  
  3. public void doSomething() {
  4. System.out.println("未定义");
  5. }
  6. }

测试

  1. public class MainClass {
  2. public static void main(String[] args) {
  3. Person person = new Person();
  4.  
  5. person.setHour(7);
  6. person.doSomething();
  7.  
  8. person.setHour(12);
  9. person.doSomething();
  10.  
  11. person.setHour(18);
  12. person.doSomething();
  13.  
  14. person.setHour(8);
  15. person.doSomething();
  16. }
  17. }

22状态模式State的更多相关文章

  1. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  2. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  3. 状态模式(State)-设计模式

    软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...

  4. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  5. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  6. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  7. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  8. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

随机推荐

  1. h5本地缓存(localStorage,sessionStorage)

    H5本地存储数据 localStorage,sessionStorage的区别: 相同点:  缓存数据比cookie的范围大; localStorage:关闭浏览器数据不会消失,除非手动删除数据 se ...

  2. js写滚动的文字

    页面中的文字,逐个显示在页面:由于电脑的配置较低,录制的视频相对来说比较卡顿 思路: 用一个定时器将预制的文字通过字符串截取.substring(0, i)方法不断的赋给要显示的区域,i在定时器里面迭 ...

  3. 百度杯 ctf 九月场---Text

    一看题目发现善于查资料就行了,那估计就是以前的漏洞,需要百度搜一下,果然是海洋cms的漏洞!这个漏洞是前台getshell漏洞,seach漏洞,该漏洞成因在于search.php没有对用户输入内容进行 ...

  4. db2删除表中数据

    DB2数据库系统建表后,难免会有将表中数据清空的需求,本文将为您介绍DB2数据库中四种数据删除的方法,供您参考,您可以根据实际情况来进行选择,希望能对有所帮助. 1. 使用 DELETE 语句,即: ...

  5. Unity Inspector面板常用的属性

    在扩展Unity的时候,往往会用到一些属性,这里将常用的列一下. 1.属性只读: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngin ...

  6. JavaScript数组(二)实例

    一.Js 数组示例常用操作. $(function () { Javascript数组学习 var nums = new Array([10], [5],[ 8], [2], [3]); 数组反转 n ...

  7. CentOS 7最小安装之后应该尽快做好的几件事情

    1        导言 CentOS的最小系统仅包含内核和必要的工具,派不上多大用处,以后还得安装很多附加软件.为了方便以后的工作,还需要对系统做一些调整和补充. 本文涉及的工作均应以root身份执行 ...

  8. 《Python数据分析与挖掘实战》读书笔记

    大致扫了一遍,具体的代码基本都没看了,毕竟我还不懂python,并且在手机端的排版,这些代码没法看. 有收获,至少了解到以下几点: 一. Python的语法挺有意思的     有一些类似于JavaSc ...

  9. Hexo 博客 github.io MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. linux下rocksdb的编译安装

    RocksDB起源于Facebook的实验室项目,实现了一个高性能的快速存储器,是基于C++编写的key value数据库,很多软件都是采用内置rocksdb的方式运行,所以需要我们提前安装rocks ...