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. 018.Zabbix维护时间和模板导入

    一 维护时间 在某些正常业务维护期间,不需要进行告警,可添加维护时间. 二 维护时间添加 2.1 维护 参数 描述 Name 维护名称 Maintenance type 两种维护类型可选: With ...

  2. C# 动态加载组件后怎么在开发环境中调试

    动态加载组件 那就是简单的Assembly.Load动态加载dll而以.这网上资料也有不少.基本的思路基本上就是在本地上一个指定目录如[plugs]存在着一堆dll文件.主程序在初始运行时一般会把指定 ...

  3. Jindent——让intellij idea 像eclipse一样生成模版化的javadoc注释

    插件地址 http://plugins.jetbrains.com/plugin/2170?pr=idea 安装方法参考 http://www.cnblogs.com/nova-/p/3535636. ...

  4. 图的遍历 之 深搜dfs

    DFS 遍历 深度优先搜索是一个递归过程,有回退过程. 对一个无向连通图,在访问图中某一起始顶点u 后,由u 出发,访问它的某一邻接顶点v1:再从v1 出发,访问与v1 邻接但还没有访问过的顶点v2: ...

  5. [POI2013]Polaryzacja

    [POI2013]Polaryzacja 题目大意: 给定一棵\(n(n\le250000)\)个点的树,可以对每条边定向成一个有向图,这张有向图的可达点对数为树上有路径从\(u\)到达\(v\)的点 ...

  6. CentOS 7 yum 安装subversion

    yum list installed | grep subversionyum install subversioncd /var/wwwsvn -hsvn co svn://121.196.226. ...

  7. mongodb用mongoose查库的对象,不能增加属性

    node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑 mongoose 是个ODM(Object Document Mappe ...

  8. redis 写磁盘出错 Can’t save in background: fork: Cannot allocate memory (转)

    查看 Redis 日志 发现系统在频繁报错: [26641] 18 Dec 04:02:14 * 1 changes in 900 seconds. Saving… [26641] 18 Dec 04 ...

  9. Gson通过借助TypeToken获取泛型参数的类型的方法(转)

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

  10. .net core中的高效动态内存管理方案

    .net core在新增的System.Buffers中引入了一大堆高效内存管理的类,如span和memory.内存池.本文今天这里介绍一个高效动态内存访问方案. ReadOnlySequenceSe ...