【读书活动感悟分享】极客充电队——《Head First 设计模式》第十章状态模式读书心得_文章

【读书活动感悟分享】极客充电队——《Head First 设计模式》第十章状态模式读书心得

杨磊
发表于 2025-11-11 17:42:45

在本章设计模式的读书学习中,本文以糖果机为例,从结构化编程到状态模式设计的演变过程,我总结出了状态模式的主要特点以及应用场景。


首先简单介绍一下什么是状态模式?
在状态模式中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为型模式。
状态模式允许对象在内部状态改变时改变其行为,使得对象在不同的状态下有不同的行为表现。通过将每个状态封装成独立的类,可以避免使用大量的条件语句来实现状态切换。

主要解决的问题是状态模式解决对象行为依赖于其状态的问题,使得对象可以在状态变化时切换行为。
使用场景:当代码中存在大量条件语句,且这些条件语句依赖于对象的状态时。


关键代码有:
1)定义上下文类:包含一个状态对象的引用,并在状态改变时更新其行为。
2)创建具体状态类:实现状态接口,根据状态的不同实现具体的行为。
3)定义状态接口:声明一个或多个方法,用于封装具体状态的行为。


优点:
封装状态转换规则:将状态转换逻辑封装在状态对象内部。
易于扩展:增加新的状态类不会影响现有代码。
集中状态相关行为:将所有与特定状态相关的行为集中到一个类中。
简化条件语句:避免使用大量的条件语句来切换行为。
状态共享:允许多个上下文对象共享同一个状态对象。


缺点:
1)增加类和对象数量:每个状态都需要一个具体的状态类。
2)实现复杂:模式结构和实现相对复杂。
3)开闭原则支持不足:增加新状态或修改状态行为可能需要修改现有代码。


状态模式类图:


个人体会:
我觉得状态模式是允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象,状态模式是一种对象行为型模式。
状态模式包含三个角色:环境类又称为上下文类,它是拥有状态的对象,在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象,可以定义初始状态;抽象状态类用于定义一个接口以封装与环境类的一个特定状态相关的行为;具体状态类是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
状态模式描述了对象状态的变化以及对象如何在每一种状态下表现出不同的行为。
状态模式的主要优点在于封装了转换规则,并枚举可能状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数;其缺点在于使用状态模式会增加系统类和对象的个数,且状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱,对于可以切换状态的状态模式不满足“开闭原则”的要求。


111 0

评论


意见反馈