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. linux学习笔记-11.正则表达式

    1.cut截取以:分割保留第七段 grep hadoop /etc/passwd | cut -d: -f7 2.排序 du | sort -n 3.查询不包含hadoop的 grep -v hado ...

  2. jsp中的隐含9对象

    jsp中的隐含9对象 request ----> HttpServletRequest. response ---> HttpServletResponse. session ----&g ...

  3. 隧道接口工具airtun-ng

    隧道接口工具airtun-ng   airtun-ng是aircrack-ng套件提供的一个工具.该工具可以为无线网卡建立隧道接口.通过该接口,渗透测试人员可以建立wIDS,分析指定的AP的数据.借助 ...

  4. 运行程序,解读this指向---case5

    function OuterFn() { innerFn = function() { console.log(1); }; return this; } OuterFn.innerFn = func ...

  5. android studio svn 创建分支

    创建分支或标签 从哪里复制 工作副本 用这个变体去创建分支,并带着当地的改变.通常,服务项将被 添加带历史 , 不仅仅只有目标目录. 每个不同于根的版本文件 ,将被指定的复制.它推荐 去更新 工作副本 ...

  6. 让nginx支持HLS

    准备工作: 1.安装nginx和rtmp模块 2.安装ffmepg(用来推流) 以上准备工作参见这篇博客:http://www.cnblogs.com/damiao/p/5231221.html 1. ...

  7. ARM Memory Copy

    MODULE ARM_MEMORY PUBLIC ARM_MEMCPY PUBLIC ARM_MEMSET PUBLIC ARM_MEMSET8 PUBLIC ARM_MEMSET16 PUBLIC ...

  8. AngularJS报错:[$injector:unpr] Unknown provider: $templateRequestProvider

    在页面中由上到下引用了: angular.js angular-route.js 创建model的时候也写明了依赖: var someApp = angular.module('someApp',[' ...

  9. 在ASP.NET MVC中使用typeahead.js支持预先输入,即智能提示

    使用typeahead.js可以实现预先输入,即智能提示,本篇在ASP.NET MVC下实现.实现效果如下: 首先是有关城市的模型. public class City { public int Id ...

  10. CentOS MongoDB 高可用实战

    原文:https://www.sunjianhua.cn/archives/centos-mongodb.html 一.MongoDB 单节点 1.1.Windows 版安装 1.1.1 获取社区版本 ...