如何实现设计模式系列中的状态模式.doc
《如何实现设计模式系列中的状态模式.doc》由会员分享,可在线阅读,更多相关《如何实现设计模式系列中的状态模式.doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 由于最近热播清宫剧甄嬛传的影响(我确实是口味有点太重了),勾起了我重游故宫的欲望,想去看看过去皇上与后宫妃子们生活的地方,于是今天便将想法赋予了行动,虽然天气严寒但是也不能阻挡我这颗赤热的心。一、应用场景 早上八点半 起床梳洗出门前往天安门,到了天安门第一感觉就是这么冷的天人怎么还是这么多?看来大家都跟我一样有一颗炽热的心啊。进入到午门让我猛然想起了一句台词 -推出午门斩首,顿时感觉伴君如伴虎啊。买票进入后我的参观路线为:太和殿也称“金銮殿”-乾清宫-御花园- 东六宫-九龙壁。在参观每一处宫殿时我的心里状态都在发生着不同的变化。比如:1、太和殿:是清明两代举行大型典礼的地方,例如像皇帝的登基
2、、大婚、册立皇后、派将出征、公布皇榜等重大的仪式都在这里举行,让我感觉皇上的家的客厅真的宏伟气派啊,脑海中幻想着当时举行大型仪式的情景甚是激动。 2、乾清宫:该宫殿在明朝到清康熙年间,一直是皇帝居住并处理政务的寝宫,雍正即位后,将寝宫移至养心殿,这里就成了举行内廷典礼和引见官员的地方,这时我的心里感觉是不是因为养心殿距离后宫很近雍正才搬过去的呀? 3、御花园:始皇帝、皇后茶余饭后休息游乐的场所,不过御花园真的没有想象中的漂亮啊,很是失落。 4、东六宫:一般都是后宫嫔妃们的住所,不过现在大部分宫殿都成展馆了,已经看不出当年嫔妃们生活的环境了,失落失落失落。 5、九龙壁:该墙壁上有九条龙,是故宫一
3、处著名的景观,据说当年在烧制这座九龙壁的时候,由于工艺要求极高,烧制难度极大,废品率很高。工匠们一不小心, 把这条白龙龙腹烧坏了,但当时已经没有足够的时间再烧一次了,显然,大家的杀身之祸即将来临。有位木匠师傅冒着犯有欺君之罪的生命危险,连夜用木料雕刻成 那块龙腹,钉补上去,刷上白色油漆,使之同原来的白龙腹颜色相同,终于瞒过了前来检查的官员,并使工匠们免去一场灾难。顿时体会到了三十六计的重要性。 不是要写设计模式吗?结果一开始搞了一大堆废话,呵呵,那么用代码来实现以下今天游故宫的场景吧。 第一步:首先能我参观了五处景点,先将五处景点定义一个枚举类型,代码如下: 1 / 2 / 故宫景点 3 /
4、4 enum ImperialPalaceEnum 5 6 太和殿, 7 乾清宫, 8 御花园, 9 东六宫,10 九龙壁11 第二步:实现我每参观一处景点心里状态的变化,代码如下: 1 / 2 / 故宫参观类 3 / 4 public class IPVisit 5 6 / 7 / 当前地点 8 / 9 private ImperialPalaceEnum ipCurrentSpot;10 public ImperialPalaceEnum IpCurrentSpot11 12 set13 14 ipCurrentSpot = value;15 16 17 18 / 19 / 体会感受景点2
5、0 / 21 public void ExperienceSpot()22 23 /体会感受当前景点24 switch (ipCurrentSpot)25 26 case ImperialPalaceEnum.太和殿:27 Console.WriteLine(太和殿:皇上的家的客厅真的宏伟气派啊,脑海中幻想着当时举行大型仪式的情景甚是激动!);28 break;29 case ImperialPalaceEnum.乾清宫:30 Console.WriteLine(乾清宫:是不是因为养心殿距离后宫很近雍正才搬过去的呀?);31 break;32 case ImperialPalaceEnum.御
6、花园:33 Console.WriteLine(御花园:御花园真的没有想象中的漂亮啊,很是失落.);34 break;35 case ImperialPalaceEnum.东六宫:36 Console.WriteLine(东六宫:已经看不出当年嫔妃们生活的环境了,成展馆了.);37 break;38 case ImperialPalaceEnum.九龙壁:39 Console.WriteLine(九龙壁:在宫中混,不会点三十六计都没脸见人.);40 break;41 42 43 第三步:主函数调用代码如下: 1 IPVisit visit = new IPVisit(); 2 3 visit.
7、IpCurrentSpot = ImperialPalaceEnum.太和殿; 4 visit.ExperienceSpot(); 5 6 visit.IpCurrentSpot = ImperialPalaceEnum.乾清宫; 7 visit.ExperienceSpot(); 8 9 visit.IpCurrentSpot = ImperialPalaceEnum.御花园;10 visit.ExperienceSpot();11 12 visit.IpCurrentSpot = ImperialPalaceEnum.东六宫;13 visit.ExperienceSpot();14 15
8、visit.IpCurrentSpot = ImperialPalaceEnum.九龙壁;16 visit.ExperienceSpot(); 运行结果为:1 太和殿:皇上的家的客厅真的宏伟气派啊,脑海中幻想着当时举行大型仪式的情景甚是激动!2 乾清宫:是不是因为养心殿距离后宫很近雍正才搬过去的呀?3 御花园:御花园真的没有想象中的漂亮啊,很是失落.4 东六宫:已经看不出当年嫔妃们生活的环境了,成展馆了.5 九龙壁:在宫中混,不会点三十六计都没脸见人.6 请按任意键继续. . .二、状态模式 分析上边的代码我们会发现,参观故宫IPVisit的对象的行为取决于它的状态,例如:ipCurrentE
9、num属性等于不同的属性值时,体会景点方 法:ExperienceSpot所做的行为就会不同。这样一来首先就会导致我们一个方法出现了不同的职责,如果一个这个方法的责任过多那么维护起来必然 是头疼的,例如看上边场景代码中的第二步中的代码,switch中的每一个case与break之间都实现了一种状态的行为。那么这个时候如果新增了一个 景点(状态)就要修改此处的代码,导致违背了开放-封闭原则。这时有人就会说了,我们有的时候需求没有那么复杂我 觉得用switch这样实现就很好,既简单又明了,这点我也非常赞同,设计就是根据实际需求来订的量身定做的设计才是最好的设计。话说的有点远了,那么如 何优化我们上
10、面的代码,使它可以灵活的扩展状态降低复杂度呢?不必担心,设计模式四人帮的前辈们已经在这类问题上给出了一个完美的解决方案,状态模式隆重 登场! 1、什么是状态模式?设计模式一书中的定义为:当一个对象在其内部状态改变时改变它的行为,对象看起来好像是修改其类。 2、状态模式类图 Context:维护一个状态的实例,这个实例定义的是当前的状态。 State: 该接口抽象Context一个特定状态的相关行为。 ConcreteState:实现了Context具体状态的行为。 3、状态模式代码实现 Context类用来维护一个当前状态的实例,表示当前状态,代码如下: 1 / 2 / 维护了当前状态的主体
11、3 / 4 public class Context 5 6 public Context() 7 public Context(State state) 8 9 this.currentState = state;10 11 private State currentState;12 public State CurrentState13 14 set15 16 currentState = value;17 18 19 20 / 21 / 执行当前状态22 / 23 public void Request()24 25 currentState.Handle(this);26 27 Sta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 实现 设计 模式 系列 中的 状态
限制150内