head first----------浅谈状态模式
    状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类
    实现代码如下:
     package com.clark.statepattern.state;
/**
 * 将所有的方法封装到一个状态类中,
 * insertQuarter(),ejectQuarter(),turnCrank(),dispense()
 * 没一个状态都定义成一个类,实现接口State
 * @author Administrator
 *
 */
public interface State {
//投币
public void insertQuarter();
//退币
public void ejectQuarter();
//转动糖果机
public void turnCrank();
//出糖果
public void dispense();
}

package com.clark.statepattern.state;
/**
 * 糖果机器生产
 * @author Administrator
 *
 */
public class GumballMachine {
//定义四个状态对象
public State soldOutState;
public State noQuarterState;
public State hasQuarterState;
public State soldState;
public State winnerState;
//初始化状态为soldOutState
State state=soldOutState;
//初始化糖果个数
public int count=0;

public GumballMachine(int count) {
this.count = count;
soldOutState = new SoldOutState(this);
soldState = new SoldState(this);
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
winnerState = new WinnerState(this);
if(count>0){
state=noQuarterState;
}
}
public void insertQuarter(){
state.insertQuarter();
}
public void ejectQuarter(){
state.ejectQuarter();
}
public void turnCrank(){
state.turnCrank();
state.dispense();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void releaseBall(){
System.out.println("A gumball comes rolling............");
if(count!=0){
count--;
}
}
public State getSoldOutState() {
return soldOutState;
}
public State getNoQuarterState() {
return noQuarterState;
}
public State getHasQuarterState() {
return hasQuarterState;
}
public State getSoldState() {
return soldState;
}
public int getCount() {
return count;
}
public State getWinnerState() {
return winnerState;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return count+" gumballs";
}
}

package com.clark.statepattern.state;

import java.util.Random;

public class HasQuarterState implements State {
GumballMachine gumballMachine;
//增加一个随机数,产生10%赢的机会
Random randomWinner=new Random(System.currentTimeMillis());
public HasQuarterState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("you couldn't insert twice quarter");
}

@Override
public void ejectQuarter() {
System.out.println("Quarter returned");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}

@Override
public void turnCrank() {
System.out.println("you turned......");
int winner = randomWinner.nextInt(10);
if((winner==0)&&(gumballMachine.getCount()>1)){
gumballMachine.setState(gumballMachine.getWinnerState());
}else{
gumballMachine.setState(gumballMachine.getSoldState());
}
}

@Override
public void dispense() {
System.out.println("No gumball dispense");
}

}


package com.clark.statepattern.state;

public class NoQuarterState implements State {
public GumballMachine gumballMachine;
public NoQuarterState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("You insert a quarter");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}

@Override
public void ejectQuarter() {
System.out.println("You haven't insert a quarter");
}

@Override
public void turnCrank() {
System.out.println("you turned!but there is no quarter");
}

@Override
public void dispense() {
System.out.println("you need to pay first");
}

}


package com.clark.statepattern.state;

public class SoldOutState implements State {
GumballMachine gumballMachine;
public SoldOutState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("there isn't a quarter to sale");
}

@Override
public void ejectQuarter() {
System.out.println("you couldn't eject any other quarter");
}

@Override
public void turnCrank() {
System.out.println("you couldn't turn crank");
}

@Override
public void dispense() {
System.out.println("there no gumball to dispense");
}

}

package com.clark.statepattern.state;

public class SoldState implements State {
GumballMachine gumballMachine;
public SoldState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("please wait,we have already giving you a gumball");
}

@Override
public void ejectQuarter() {
System.out.println("Sorry!you have turn crank");
}
@Override
public void turnCrank() {
System.out.println("turning twice doesn't give you another gumball");
}

@Override
public void dispense() {
gumballMachine.releaseBall();
if(gumballMachine.getCount()>0){
gumballMachine.setState(gumballMachine.getNoQuarterState());
}else{
System.out.println("out of gumballs!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}

}

package com.clark.statepattern.state;

public class WinnerState implements State {
GumballMachine gumballMachine;
public WinnerState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("please wait,we have already giving you a gumball");
}

@Override
public void ejectQuarter() {
System.out.println("Sorry!you have turn crank");
}
@Override
public void turnCrank() {
System.out.println("turning twice doesn't give you another gumball");
}
//给两次释放糖果的机会,让后进入NoQuarter State和SoldOutState
@Override
public void dispense() {
System.out.println("You are a winner!you get two gumballs for you quarter");
gumballMachine.releaseBall();
if(gumballMachine.getCount()==0){
gumballMachine.setState(gumballMachine.getSoldOutState());
}else{
gumballMachine.releaseBall();
if(gumballMachine.getCount()>0){
gumballMachine.setState(gumballMachine.getNoQuarterState());
}else{
System.out.println("out of gumballs!!!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}

}

package com.clark.statepattern.state;
//测试类
public class GumballMachineTest {
public static void main(String[] args) {
GumballMachine gumballMachine= new GumballMachine(5);
System.out.println(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
}
}

//======以下为测试结果,其中结果存在随即性,其主要是由于WinnerState引起的,如果存在十次抽中一次中奖的游戏,则其送一个免费的糖果==================
5 gumballs
You insert a quarter
you turned......
A gumball comes rolling............
4 gumballs
You insert a quarter
you turned......
A gumball comes rolling............
You insert a quarter
you turned......
You are a winner!you get two gumballs for you quarter
A gumball comes rolling............
A gumball comes rolling............
1 gumballs


head first--------------state pattern的更多相关文章

  1. 十一个行为模式之状态模式(State Pattern)

    定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...

  2. 深入浅出设计模式——状态模式(State Pattern)

    模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...

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

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

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

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

  5. 第20章 状态模式(State Pattern)

    原文 第20章 状态模式(State Pattern) 状态模式  概述:   当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表 ...

  6. C#设计模式之十九状态模式(State Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西, ...

  7. 使用C# (.NET Core) 实现状态设计模式 (State Pattern)

    本文的概念性内容来自深入浅出设计模式一书 项目需求 这是一个糖果机的需求图. 它有四种状态, 分别是图中的四个圆圈: No Quarter: 无硬币 Has Quater 有硬币 Gumball So ...

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

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

  9. C#设计模式之十八状态模式(State Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...

  10. 用 State Pattern 来实现一个简单的 状态机

    首先要理解 State Pattern 模式. http://www.dofactory.com/net/state-design-pattern Definition Allow an object ...

随机推荐

  1. [转]eclipse转idea, 快捷键设置

    原文地址: eclipse转idea, 快捷键设置   设置快捷键的途径: 打开idea的配置,找到Keymap,设置为eclipse 另外还要手动设置某些快捷键 上下移动 点击类打开 代码提示 查询 ...

  2. hdu 5752 Sqrt Bo 水题

    Sqrt Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5752 Description Let's define the function f ...

  3. dubbox REST服务使用fastjson替换jackson

    上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包 ...

  4. POJ 1743 Musical Theme (字符串HASH+二分)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15900   Accepted: 5494 De ...

  5. vbs学习笔记2——创建桌面快捷方式

    脚本 Set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolde ...

  6. python服务端内存泄露的处理过程

    http://xiaorui.cc http://xiaorui.cc/2017/08/20/python服务端内存泄露的处理过程/

  7. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  8. MTK65XX平台充电调试总结

    MTK平台充电调试总结 摘要:调试电池的充放电管理,首先须要深入了解锂电池的电池原理和特点.充放电特性以及主要的电池安全问题.然后须要对MTK的电池管理驱动程序有深入的了解.理解电池充放电算法的基本原 ...

  9. 使用IProgress实现异步编程的进程通知

    在异步编程中,有时候希望把进度展示出来,借助IProgress<in T>可以实现. IProgress<in T>只提供了一个方法void Report(T value),通 ...

  10. Windows Phone本地数据库(SQLCE):3、[table]attribute(翻译) (转)

    这是“windows phone mango本地数据库(sqlce)”系列短片文章的第三篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知 ...