首页 > 代码库 > 软考总结— 设计模式之状态模式

软考总结— 设计模式之状态模式

   软考在即,针对下午题的设计模式,本人有觉得有必要从考试战略上稍微做一些总结。为什么呢?一方面设计模式只要掌握好做题技巧,还是比较好拿分的。另一方面,通过这次软考又进一步的学习设计模式,而且在题目中给出的设计模式都是在项目中很好的应用。

   一开始做题,没有全局观。俗话说的好“不谋全局者不足谋一域”,不管做什么事,先在战略方向上把握好了,采取什么样的战术,都不成什么问题了。所以考试也是一样。下面这道题就很典型:


  【题目】

       某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图5-1所示:


 

     1.联系生活:纸巾售卖机跟自动售货机一样,想一下自己去买饮料的时候,是怎么操作的?

     2.注意宏观:宏观描述状态转换,以免丢掉细节(例如,取下纸巾按钮,就有两种情况)

     3.题目跟UML图对应     

 

 【题目】

      采用状态(State)模式来实现该纸巾售卖机,得到如图5-2所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldStateSoldOutStateNoQuarterStateHasQuarterState分别对应图5-1中纸巾售卖机的4种状态:售出纸巾、纸巾售完、没有投币、有2元钱。

    

    
   4.分析UML图 并与代码对应(代码就不贴了)

     根据UML图和代码,可以看出TissueMachine类中,枚举了各种具体状态并定义了当前对象State。在声明状态时需要用到抽象类State。所以第(1)空填State。


   后面的2~5个空,都是子类继承State抽象类,用于状态之间的转换。这时候,前面对题干的分析就显得很重要了。根据题干可知,SoldState对应“售出纸巾”状态、SoldOutState 对应“纸巾售完”状态、NoQuarterState对应“没有纸币”状态、HasQuarterState对应“有2元钱”状态。


   例如第(2)空,状态类NoQuarterState(没有纸币)调用insertQuarter()方法,纸巾售卖机的状态将切换到“有2元钱”,因此setState()方法中的参数应该为具体状态类HasQuarterState对象,该对象已存在于环境类TissueMachine中,可以通过tissueMachine->getHasQuarterState()或tissueMachine.getHasQuarterState()或new HasQuarterState来获取,第(3)-(5)空与之类似。


总结

    1. 全局观:对题目有一个整体的把控
    2. 联系生活实际(自动售货机):了解状态之间的关系,看图说话
    3. 不要急功近利:上来就看代码,企图光看懂代码来做题
    4. 状态模式内涵:状态模式定义了一个 维护各个具体状态类(TissuMachine),并且状态的切换由各个具体状态类来完成。
   联系职责链模式:用来处理外部请求,并且使每一个请求都有机会得到处理。跟状态模式很相似,但是不同的是,职责链模式的请求处理是通过抽象处理类来维护的。