设计模式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;
????? }
??? }
? }
}

【设计模式】学习笔记14:状态模式(State)

认识状态模式 假设有一个糖果机, 它的工作状态图如下:要用代码实现糖果机的功能, 如果不用状态模式: 一种方法是创建一个类,它的作用就是一个状态机,对每一个动作,我们都创建了一个对应的方法,这些方法...
  • shuangde800
  • shuangde800
  • 2013年08月22日 00:15
  • 19664

常用设计模式及例子(五)

 13、策略模式(strategy) 策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,...
  • cike_001
  • cike_001
  • 2017年06月07日 15:12
  • 154

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

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

"围观"设计模式(21)--行为型之状态模式(State Pattern)

状态模式--允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。----百度百科 个人理解 状态模式应该说可以理解为某种状态下,程序的执行流程可能会发生变化,类...
  • wangyang1354
  • wangyang1354
  • 2016年06月13日 15:11
  • 3411

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解本文地址: http://blog.csdn.net/caroline_wendy状态模式(state pattern): 允许对象在内部状态改变时改变它的...
  • u012515223
  • u012515223
  • 2014年07月11日 17:42
  • 2097

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

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

JAVA设计模式(18):行为型-状态模式(State)

“人有悲欢离合,月有阴晴圆缺”,包括人在内,很多事物都具有多种状态,而且在不同状态下会具有不同的行为,这些状态在特定条件下还将发生相互转换。就像水,它可以凝固成冰,也可以受热蒸发后变成水蒸汽,水可以流...
  • taozi8023
  • taozi8023
  • 2016年05月19日 20:26
  • 6359

【JS设计模式】状态模式的代码示例

1. 概述  当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。2. 解决的问题  主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同...
  • itpinpai
  • itpinpai
  • 2016年06月03日 17:45
  • 3512

Android中MVP设计模式实例

MVP(Model ViewPresenter)模式是著名的MVC(Model ViewController)模式的一个演化版本,目前它在Android应用开发中越来越重要了。初看起来我们会感觉增加了...
  • q908555281
  • q908555281
  • 2015年11月06日 15:52
  • 1784

设计模式-----COMMAND模式

COMMAND模式是最简单,最优雅的设计模式之一。COMMAND模式的使用范围非常宽广。 COMMAND模式通过对命令的封装接触了系统的逻辑互联关系和实际连接的设备之间的耦合。简单的说就是COMMA...
  • u013812682
  • u013812682
  • 2016年11月28日 16:44
  • 275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式State 的一个例子
举报原因:
原因补充:

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