状态模式(state pattern) 未使用状态模式详解

状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂.

具体方法:

1. 状态转换类.

/**
 * @time 2014年7月11日
 */
package state;  

/**
 * @author C.L.Wang
 *
 */
public class GumballMachine {  

    final static int SOLD_OUT = 0;
    final static int NO_QUARTER = 1;
    final static int HAS_QUARTER = 2;
    final static int SOLD = 3;  

    int state = SOLD_OUT;
    int count = 0;  

    public GumballMachine(int count) {
        this.count = count;
        if (count > 0) {
            state = NO_QUARTER; //转换模式
        }
    }  

    public void insertQuarter() { //输入25分钱
        if (state == HAS_QUARTER) {
            System.out.println("You can't insert another quarter.");
        } else if (state == NO_QUARTER) {
            state = HAS_QUARTER;
            System.out.println("You inserted a quarter.");
        } else if (state == SOLD_OUT) {
            System.out.println("You can't insert a quarter, the machine is sold out.");
        } else if (state == SOLD) {
            System.out.println("Please wait, we're already giving you a gumball.");
        }
    }  

    public void ejectQuarter() { //退回25分钱
        if (state == HAS_QUARTER) {
            System.out.println("Quarter returned.");
            state = NO_QUARTER;
        } else if (state == NO_QUARTER) {
            System.out.println("You haven't inserted a quarter.");
        } else if (state == SOLD) {
            System.out.println("Sorry, you already turned the crank.");
        } else if (state == SOLD_OUT) {
            System.out.println("You can't eject, you haven't inserted a quarter yet.");
        }
    }  

    public void turnCrank() { //摇动转杆
        if (state == SOLD) {
            System.out.println("Turning twice doesn't get another gumball.");
        } else if (state == NO_QUARTER) {
            System.out.println("You turned but there's no quarter.");
        } else if (state == SOLD_OUT) {
            System.out.println("You turned, but there are no gumballs");
        } else if (state == HAS_QUARTER) {
            System.out.println("You turned...");
            state = SOLD;
            dispense();
        }
    }  

    public void dispense() {
        if (state == SOLD) {
            System.out.println("A gumball comes rolling out the slot.");
            count--;
            if (count == 0) {
                System.out.println("Opps, out of gumballs.");
                state = SOLD_OUT;
            } else {
                state = NO_QUARTER;
            }
        } else if (state == NO_QUARTER) {
            System.out.println("You need to pay first.");
        } else if (state == SOLD_OUT) {
            System.out.println("No gumball dispensed.");
        } else if (state == HAS_QUARTER) {
            System.out.println("No gumball dispensed.");
        }
    }  

    public void refill(int numGumballs) {
        this.count = numGumballs;
        state = NO_QUARTER;
    }  

    public String toString() {
        StringBuffer result = new StringBuffer();
        result.append("\nMighty Gumball, Inc.");
        result.append("\nJava-enabled Standing Gumball Model #2004\n");
        result.append("Inventory: " + count + " gumball");
        if (count != 1) {
            result.append("s");
        }
        result.append("\nMachine is ");
        if (state == SOLD_OUT) {
            result.append("sold out.");
        } else if (state == NO_QUARTER) {
            result.append("waiting for quarter.");
        } else if (state == HAS_QUARTER) {
            result.append("waitring for turn of crank.");
        } else if (state == SOLD) {
            result.append("delivering a gumball.");
        }
        result.append("\n");
        return result.toString();
    }
}

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索system
, result
, state
, else
, out
, println
State模式
state pattern、logback pattern 详解、urlpattern 设置详解、android pattern详解、lockpatternview详解,以便于您获取更多的相关知识。

时间: 2024-09-30 12:24:14

状态模式(state pattern) 未使用状态模式详解的相关文章

代理模式(proxy pattern) 未使用代理模式 详解

如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供状态信息, 并提供一些get方法, 进行调用. /** * @time 2014年7月11日 */ package proxy; /** * @author C.L.Wang * */ public class GumballMachine { String location; //

状态模式(state pattern) 详解

状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(), 具体状态类(concrete state)继承(implement)状态类(state), 实现handle()方法; 具体方法

.net设计模式实例之状态模式(State Pattern)

一.状态模式简介(Brief Introduction) 状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这个对象 看起来像是改变了其类. 二.解决的问题(What To Solve) 状态模式主要解决的是当控制一个对象状态装换的条件表达式过于复杂时的情况.把状态 的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化. 当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可 以考虑使用状态模式了. 三.状态模式分析(Ana

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

原文:乐在其中设计模式(C#) - 状态模式(State Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例 有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里.在对象内部可以根据用户的不同选择不同的数据持久化方案. MessageModel using

JSP使用MVC模式完成删除和修改功能实例详解_JSP编程

本文实例讲述了JSP使用MVC模式完成删除和修改功能的方法.分享给大家供大家参考.具体如下: 目标: ① 进一步理解MVC模式: ② 掌握删除功能的基本实现过程: ③ 掌握修改功能的基本实现过程. 主要内容: ① 使用MVC完成删除功能: ② 使用MVC模式完成信息更新功能. 1.如何使用MVC模式完成删除功能 根据MVC模式的特点,分别考虑MVC的3个部分. ① 首先考虑V部分: 输入:通常删除功能是在查询的基础上完成的,所以在用户信息列表界面上可以添加删除的超链. 输出:提示用户删除是否成功

Python语言:定制pattern的string模板(template) 详解

string.Template的pattern是一个正则表达式, 可以通过覆盖pattern属性, 定义新的正则表达式. 如: 使用新的定界符"{{", 把{{var}}作为变量语法. 代码: # -*- coding: utf-8 -*- ''''' Created on 2014.6.5 @author: Administrator @edition : python 3.3.0, eclipse pydev ''' import string t = string.Templat

java 正则表达式 pattern类 matcher类详解

一.正则表达式基础知识 我们先从简单的开始.假设你要搜索一个包含字符"cat"的字符串,搜索用的正则表达式就是"cat".如果搜索对大小写不敏感,单词"catalog"."Catherine"."sophisticated"都可以匹配.也就是说: 1.1 句点符号 假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以"t"字母开头,以"n"字母结束.另外

详解Java正则表达式中Pattern类和Matcher类_java

前言 本文将介绍Java正则表达式中的Pattern类与Matcher类.首先我们要清楚指定为字符串的正则表达式必须首先被编译为pattern类的实例.因此如何更好的了解这两个类,是编程人员必须知道的. 以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C) 组零始终代表整个表达式. 以 (?) 开头的组是纯的

第20章 状态模式(State Pattern)

原文 第20章 状态模式(State Pattern) 状态模式        概述:           当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.         状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.        意图:          允许一个对象在其内部状态改变时改变它的行为        结构图:                 举例: