《Head First Design Patterns》笔记十二:状态模式(State Pattern)

概念
   这个模式很好理解,一个实例的行为动作根据状态不同,而实现也不同,就比方说我们用打印机,有有纸状态,无纸状态,你要打印的时候,有纸状态就直接打印,无纸呢就发出警告。
   程序的实现,我们第一直观当然是这样编码
   if (hasPage) Print();
   else ShowErrorMessage();
  这样就是在每一个动作里加上状态的判断,当然没有问题,但问题是这样的,随着需求的更改,如果有新的状态出现的话,那么就不得不对所有的动作都进行更改,这个是烦琐的,而且是极容易出错,那么我们需要用到状态模式,uml图如下

 将每个State设计为一个类,这样,对于用户来说,就根本不需要关心State内部的实现。

需求

   现在有一个自动的糖果售卖机,投入硬币,按按钮,就出糖果。我们来分析下,糖果售卖机会有几种状态,1没投币,2投币了,3出糖果了,4糖果卖光了。ok,我们来画个简单的状态图

  

   对于用户的动作要求,糖果机根据自己的状态来实现相应的回馈,参照概念的uml图,我们可以得出这里的context就是糖果机,State就是 NoMoney,HasMoney,Sold,SoldOut。  Handler有InsertMoney,EjectMoney,TurnCrank,Dispense等几个动作,

   Nomoney的状态下,用户投币,则状态会随之改变为HasMoney。

   HasMoney的状态下,用户转出糖果的按钮,则出糖果,状态改为Sold。

   Sold的状态下,用户取出糖果,则判断剩余数量是否为空,空则SoldOut,否则状态改为NoMoney。

   我们对于每个State实现所有的Handler,当有新的State出现时,直接添加一个新的State类就可以,不需要影响旧有代码

实现

  首先是State接口和4个State类的实现

  IState.cs:

 

  NoMoneyState.cs:

 

  HasMoneyState.cs:

 

 SoldState.cs:

 

SoldOutState.cs:

然后是糖果机GumballMachine的实现,糖果机改变状态的方法这里采用工厂模式,把状态对象的创建分离出来。

GumballMachine.cs

枚举States.cs,这里列出所有的State

StateFactory.cs

ok,剩下的就是代码测试了

Program.cs

测试结果

insert the money
eject the money
pay first
 insert the money
turn the crank
release a gum ball

 

对比

   看到这里,是不是有种感觉,这不就是策略模式吗,都是把行为动作封装为一个接口,选择不同的行为动作来实现需求,不错,这是对的,可以这么说,策略模式和状态模式是双胞胎,极为相似,那2种模式并存意义何在呢,区别在哪,我觉得区别在于

   策略模式的行为动作完全根据用户的需要,灵活改变。而各个行为之间没什么关联。想象下策略模式章节的鸭子的flybehavior,一个是flywithwing,一个是flynoway,一个会飞,一个不会飞,2者没有关联,会飞的鸭子不会变成不会飞的,不会飞的鸭子也不会变成会飞的。

   状态模式行为动作的改变不是那么孤立,状态的处理会改变状态本身。重在状态的可转换。

注意

   这章的连连看习题书里给出的答案是错误的,不知道大家有注意到没有,这个一定要注意,不要被迷惑。

   书里原答案:

   

   正确答案,用笔描红的为我更正的答案

  

 

 

 

下一篇:  《Head First Design Patterns》笔记十三:代理模式(Proxy Pattern)

上一篇:  《Head First Design Patterns》笔记十一:组合模式(Composite Pattern)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Head First设计模式-深入浅出设计模式》是一本以简单有趣的方式介绍设计模式的书籍。设计模式是在软件开发中解决特定问题的一种经验总结,它们提供了在实际开发中可重用、可靠、灵活的解决方案。 该书的主要特点是通过生动有趣的讲解和丰富多样的图表、示例来帮助读者更好地理解和应用设计模式。作者采用了大量的图形和实例来解释设计模式的概念,使读者能够迅速理解并应用这些概念。 这本书涵盖了23种常用的设计模式,如工厂模式、单例模式、适配器模式、装饰器模式等。每一种设计模式都以一个实际的例子开始,引出该模式解决的问题,然后详细解释其结构和应用,最后通过示例代码展示如何使用该模式。 此外,该书还介绍了设计模式之间的关系和如何选择合适的设计模式。它教授了读者如何在具体问题中识别出适用的设计模式,并提供了一些实际的应用建议。 《Head First设计模式-深入浅出设计模式》以其独特的教学风格和简洁明了的讲解深受读者喜爱。这本书不仅适合初学者了解设计模式,也适合有一定经验的开发人员进一步提高他们的软件设计和编程能力。 总之,这本书以其生动有趣的讲解方式和大量的图表、实例为读者介绍了设计模式的基本概念和具体应用,是学习和理解设计模式的一本不可或缺的指南。 ### 回答2: 《Head First设计模式:深入浅出设计模式》是一本主要介绍软件设计模式的书籍。设计模式是在软件开发中经常出现的问题的解决方案,可以帮助开发人员更好地构建可重用、可扩展、可维护的代码。 这本书以深入浅出的方式介绍了23种常见的设计模式,通过生动有趣的讲解和大量的图形和实例,使读者能够更加轻松地理解和掌握设计模式。它采用了非传统的学习方式,通过讲故事、练习、谜题等方式将设计模式的概念和使用方法娓娓道来。 该书首先从简单的设计模式开始,引导读者逐步理解和掌握基础的设计原则和模式,如单例模式工厂模式等。然后,逐渐深入介绍更复杂的模式,如装饰器模式、观察者模式、策略模式等。每个模式都通过具体的案例和代码示例进行讲解,帮助读者理解模式的思想和应用场景。 除了具体的设计模式之外,这本书还关注了如何将设计模式应用到现实的软件开发中。它探讨了如何根据不同的需求选择合适的设计模式,以及如何通过设计模式提高代码的质量和可维护性。 总的来说,《Head First设计模式:深入浅出设计模式》是一本非常有趣、易懂且实用的设计模式入门书籍。无论是初学者还是有一定经验的开发人员,都能从中获得有益的知识和经验,提高软件开发的能力和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值