设计模式读书笔记之状态模式(State Pattern)

来源:互联网 发布:linux grep 模糊 编辑:程序博客网 时间:2024/04/30 19:09

状态模式:当对象内部状态发生变化时允许改变其行为,使对象看起来像自身发生了变化一样。

状态模式解决的问题是当对象的状态转换的条件过于复杂的情况, 它把状态的判断逻辑以及状态发生变化后对象的行为改变转移到不同的状态对象中去。

比如: 一个人Person, 他在不同的时间, 自身处在不同的状态, 从而有不同的行为.于是我们通常会写出这样的代码:

这样的代码用if else来做状态转换, 为我们的拓展带来困难. 状态模式就是要把这些if else 分支封装到不同的状态中, 并且把状态的转换局部化. 而促使状态发生变化的, 可能是外部因素, 也可能是用户的行为.

基础代码:

举例:很多网站比如google,163在用户进入主页面的时候,右上角显示登陆按钮/链接,当用户登录后再回到主页面,右上角会显示注销按钮,其实这就是一个状态的变迁。用户的行为(访问页面,登陆,注销等等)驱使状态发生变化,而状态的变化驱使页面的表现发生了变化。就用伪jsp/servlet来实现一个状态模式。

再给一个例子,《重构 改善既有代码的设计》一书中第一章有影片租赁的例子,顾客Customer有多条电影(Movie)租赁Rental记录,影片有3种,少儿片,普通片和最新片,三种电影计费方式和积分方式不一样,最原始的代码在写计费的时候,遍历Rental,查看每一个Movie的type,然后用switch来计算计费。作者第一次重构的时候,采用多态的方式,创建了三个Movie类,ChildMovie, RegularMovie, LatestMovie. 后来作者觉得这样做不妥, 因为影片的状态是变化的, 最新的影片会变成普通片,也就是影片的存在一种状态变迁。 于是作者第二次重构的时候,不再对Movie分类,而是Movie持有一个价格Price, 价格有分类ChildPrice, RegularPrice, latestPrice, 这样做的好处是,状态的变迁可以独立变化。

特点:

1 对象在不同状态下的行为被分装到不同的状态类中;
2 对象状态的装换局部化。

优点:将特定状态的行为局部化,并将不同的状态的行为分割开。说白了就是消除了庞大的状态条件分支判断语句,而把状态的变迁分散转移到各个子类中去。

适用场景:当对象的行为取决于状态,并且在运行时根据状态来改变行为时。

原创粉丝点击