设计模式State 的一个例子

原创 2004年08月27日 20:15:00

设计模式State 的一个例子

(引自http://blog.csdn.net/airhand/archive/2004/08/27/86405.aspx?中的部分章节)

这个实例比较长,我简单说明一下,这是一个自动售货机的例子,客户可以投掷面值5、10、25的硬币,货物价值25。每当客户投了硬币就打印投的钱数和,如果够了25,就提示货物售出。
state是个抽象类,它派生了5、10、15、20、25几种钱数和的类(也就是所有可能的钱数和),由于它们都是从STATE继承的,所以它们都有一个STATE类型的静态成员state作为状态的标识(你可以把它想象成全局变量),每个类都接收投入5、10、25面值的硬币,对应的方法是
public virtual void AddNickel(VendingMachine vm) { }
public virtual void AddDime(VendingMachine vm) { }
public virtual void AddQuarter(VendingMachine vm) { }
虽然方法一样,但是每个类内部实现的状态跃迁是不一样的,比如5元的类,接收10元后state就跃迁到了15元,以此类推。
仔细看看吧,这是一个非常有意思的实例。不过说实话,这样实现程序确实太累了,也许在别的应用中可以降低程序员的负担,不过我还没发现(有的话告诉我)。
另外如果有100种状态,有10种路径,难道每个状态都要继承(100×10)?那coding起来岂不是太累,而且代码不要太长啊,唉,当程序员真不容易啊...


using System;

abstract class State {
? public virtual void AddNickel(VendingMachine vm) {}

? public virtual void AddDime(VendingMachine vm) {}

? public virtual void AddQuarter(VendingMachine vm) {}

? protected virtual void ChangeState(VendingMachine vm, State s) {
??? vm.ChangeState(s);
? }
}

class VendingMachine {
? private State state;
? public VendingMachine() {
??? Console.WriteLine("The Vending Machine is now online: product costs 25c");
??? state = Start.Instance();
? }

? public void ChangeState(State to) {
??? state = to;
? }

? public void Vend() {
// 发饮料
??? Console.WriteLine("Dispensing product...Thank you!");
? }

? public void AddNickel() {
??? state.AddNickel(this);
? }

? public void AddDime() {
??? state.AddDime(this);
? }

? public void AddQuarter() {
??? state.AddQuarter(this);
? }
}

class Start : State {
? private static State state = new Start();
? private Start() {
? }

? public static State Instance() {
// singleton逻辑
??? Console.WriteLine("Credit: 0c");
??? return state;
? }

? public override void AddNickel(VendingMachine vm) {
??? ChangeState(vm, Five.Instance());
? }

? public override void AddDime(VendingMachine vm) {
??? ChangeState(vm, Ten.Instance());
? }

? public override void AddQuarter(VendingMachine vm) {
??? vm.Vend();
? }
}

class Five : State {
? private static State state = new Five();
? private Five() {
? }

? public static State Instance() {
// singleton 逻辑
??? Console.WriteLine("Credit: 5c");
??? return state;
? }

? public override void AddNickel(VendingMachine vm) {
??? ChangeState(vm, Ten.Instance());
? }

? public override void AddDime(VendingMachine vm) {
??? ChangeState(vm, Fifteen.Instance());
? }

? public override void AddQuarter(VendingMachine vm) {
??? vm.Vend();
??? ChangeState(vm, Start.Instance()); // no change returned :-)
? }
}

class Ten : State {
? private static State state = new Ten();
? private Ten() {
? }

? public static State Instance() {
// singleton 逻辑
??? Console.WriteLine("Credit: 10c");
??? return state;
? }

? public override void AddNickel(VendingMachine vm) {
??? ChangeState(vm, Fifteen.Instance());
? }

? public override void AddDime(VendingMachine vm) {
??? ChangeState(vm, Twenty.Instance());
? }

? public override void AddQuarter(VendingMachine vm) {
??? vm.Vend();
??? ChangeState(vm, Start.Instance()); // no change returned :-)
? }
}

class Fifteen : State {
? private static State state = new Fifteen();
? private Fifteen() {
? }

? public static State Instance() {
// singleton 逻辑
??? Console.WriteLine("Credit: 15c");
??? return state;
? }

? public override void AddNickel(VendingMachine vm) {
??? ChangeState(vm, Twenty.Instance());
? }

? public override void AddDime(VendingMachine vm) {
??? vm.Vend();
??? ChangeState(vm, Start.Instance());
? }

? public override void AddQuarter(VendingMachine vm) {
??? vm.Vend();
??? ChangeState(vm, Start.Instance()); // no change returned :-)
? }
}

class Twenty : State {
? private static State state = new Twenty();
? private Twenty() {
? }

? public static State Instance() {
// singleton 逻辑
??? Console.WriteLine("Credit: 20c");
??? return state;
? }

? public override void AddNickel(VendingMachine vm) {
??? vm.Vend();
??? ChangeState(vm, Start.Instance());
? }

? public override void AddDime(VendingMachine vm) {
??? vm.Vend();
??? ChangeState(vm, Start.Instance());
? }

? public override void AddQuarter(VendingMachine vm) {
??? vm.Vend();
??? ChangeState(vm, Start.Instance()); // no change returned :-)
? }
}

class Application {
? public static void Main() {
??? int coin = 0;
??? string input = null;
??? VendingMachine vm = new VendingMachine();
??? while (true) {
????? Console.Write("Insert a coin (5, 10, 25): ");
????? input = Console.ReadLine();
????? coin = Int32.Parse(input);
????? switch (coin) {
??????? case 5:
????????? vm.AddNickel();
????????? break;
??????? case 10:
????????? vm.AddDime();
????????? break;
??????? case 25:
????????? vm.AddQuarter();
????????? break;
??????? default:
????????? break;
????? }
??? }
? }
}

透过简单案例熟知状态模式(一)

一.状态模式简介 故名思议,状态模式的行为是由他的状态来决定的,状态模式把对象的行为动作包装在不同的状态对象里面,其中每一个状态对象都有共同的一个抽象状态基类,这样做的意图是让每一个对象内部的状态发...
  • u014115577
  • u014115577
  • 2016年09月14日 13:59
  • 381

状态模式(State)

1. 模式的定义考虑一个在线投票的应用。状态模式的定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。2. UML图Context:上下文,通常用来定义客户感兴趣的接口,同时...
  • jiangxishidayuan
  • jiangxishidayuan
  • 2016年07月23日 12:39
  • 808

C++ State模式

  • 2015年02月06日 11:00
  • 67KB
  • 下载

设计模式学习笔记——状态(State)模式框架

设计模式学习笔记——状态(State)模式框架@(设计模式)[设计模式, 状态模式, State]设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 DaySt...
  • q547550831
  • q547550831
  • 2017年04月13日 10:47
  • 553

浅谈JAVA设计模式之——状态模式(State)

一、概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 二、适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行...
  • l1028386804
  • l1028386804
  • 2015年05月09日 13:42
  • 1555

Stateflow建模与应用实例

  • 2013年06月21日 11:33
  • 2.22MB
  • 下载

状态模式(State)

18.1  场景问题 18.1.1  实现在线投票 考虑一个在线投票的应用,要实现控制同一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意刷票,要取消该用户投票的...
  • qilixiang012
  • qilixiang012
  • 2014年09月28日 18:16
  • 840

设计模式学习笔记--Strategy、State

最近在看设计模式的,防止遗忘,总结一下,如有不足还望指正! 策略模式:(strategy)定义算法家族,分别封装起来,让他们之间可以相互替换。此模式可以让算法的变化,不影响使用算法的用户。 类图如下:...
  • smartboy_01
  • smartboy_01
  • 2014年12月30日 22:32
  • 586

23种设计模式之python实现--State模式

#理解 #事物往往有多种状态,对于每一种状态,响应同一种输入的反应不同,最典型的是有限状态机 #与策略模式不同的是State模式关注的是状态,将每一种状态封装,简化复杂的switch或驱动表对状态机的...
  • apple_boys
  • apple_boys
  • 2014年04月18日 10:40
  • 684

状态模式-订单应用

今天翻了翻《领域驱动设计与模式实战》,里面详细讲解了“状态模式”,说来我对它并不陌生,几年前,我在看《Java与模式》的时候就仔细研究过,不过这么多年来却从没在实战中应用过,并不是没有遇到合适的场景,...
  • it_man
  • it_man
  • 2013年10月07日 15:54
  • 4863
收藏助手
不良信息举报
您举报文章:设计模式State 的一个例子
举报原因:
原因补充:

(最多只允许输入30个字)