分享
 
 
 

设计模式State 的一个例子

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

????? }

??? }

? }

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有