96SEO 2026-02-19 23:54 13
。

不知道大家有没有这样的感觉#xff0c;看了一大堆编程和设计模式的书#xff0c;却还是很难理解设计模式#xff0c;无…我是荔园微风作为一名在IT界整整25年的老兵今天总结一下Windows环境下如何编程实现状态模式设计模式。
不知道大家有没有这样的感觉看了一大堆编程和设计模式的书却还是很难理解设计模式无从下手。
为什么因为你看的都是理论书籍。
我今天就在Windows操作系统上安装好JAVA的IDE编程工具并用JAVA语言来实现一个状态模式真实的实现一个你看懂代码后自然就明白了。
状态模式State
Pattern行为型设计模式定义允许一个对象在其内部状态改变时改变它的行为对象看起来似乎修改了它的类。
上面定义听懂了吗莫名其妙看不懂对吧。
所以我们还是来看看实现生活中的例子。
在日常生活中人们总是有些各种喜怒哀乐的表情而且这四种状态还会互相转化包括人在内很多事物都具有多种状态而且在不同状态下会具有不同的行为这些状态在特定条件下还将发生相互转换。
而状态模式就是要模拟这种同一事物存在多种状态但又会变化转化的情况。
状态模式是一种较为复杂的设计模式它用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。
当系统中的某个对象存在多个状态这些状态之间可以进行转换而且对象在不同状态下行为不相同时可以使用状态模式。
在软件系统中有些对象具有多种状态这些状态在某些情况下能够相互转换而且对象在不同的状态下也将具有不同的行为。
通常可以使用复杂的条件判断语句if
else之类来进行状态判断和转换操作但这样会导致代码的可维护性和灵活性下降。
状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。
当系统中某个对象存在多个状态这些状态之间可以进行转换而且对象在不同状态下行为不相同时可以使用状态模式。
状态模式将一个对象的状态从该对象中分离出来封装到专门的状态类中使得对象状态可以灵活变化对于客户端而言无须关心对象状态的转换以及对象所处的当前状态无论对于何种状态的对象客户端都可以一致处理。
在状态模式结构图中包含如下三个角色Context环境类、State抽象状态类、ConcreteState具体状态类。
环境类又称为上下文类它是拥有多种状态的对象。
由于环境类的状态存在多样性且在不同状态下对象的行为有所不同因此将状态独立出去形成单独的状态类。
在环境类中维护一个抽象状态类State的实例这个实例定义当前状态在具体实现时它是一个State子类的对象。
抽象状态类用于定义一个接口以封装与环境类的一个特定状态相关的行为在抽象状态类中声明了各种不同状态对应的方法而在其子类中实现类这些方法由于不同状态下对象的行为可能不同因此在不同子类中方法的实现可能存在不同相同的方法可以写在抽象状态类中。
具体状态类是抽象状态类的子类每一个子类实现一个与环境类的一个状态相关的行为每一个具体状态类对应环境的一个具体状态不同的具体状态类其行为有所不同。
JAVA代码public
{//声明抽象业务方法不同的具体状态类可以不同的实现public
//其他属性值该属性值的变化可能会导致对象状态发生变化//设置状态对象public
}Context环境类实际上是真正拥有状态的对象这个模式的主要精神就是将Context环境类中与状态有关的代码提取出来封装到专门的状态类中。
在状态模式结构图中在Context中定义了一个State对象。
Context环境类与抽象状态类State之间存在单向关联关系也可能存在依赖或者其他关联关系。
好下面是关键的内容了这部分是这个模式和其他设计模式一个很大的不同点也是此模式复杂的地方也就是在状态模式的使用过程中一个对象的状态之间还可以进行相互转换通常有两种实现状态转换的方式(1)
统一由环境类来负责状态之间的转换此时环境类还充当了状态管理器(State
Manager)角色在环境类的业务方法中通过对某些属性值的判断if
else之类实现状态转换还可以提供一个专门的方法用于实现属性判断和状态转换如下所示public
由具体状态类来负责状态之间的转换可以在具体状态类的业务方法中判断环境类的某些属性值再根据情况为环境类设置新的状态对象实现状态转换同样也可以提供一个专门的方法来负责属性值的判断和状态转换。
此时状态类与环境类之间就将存在依赖或关联关系因为状态类需要访问环境类中的属性值如下所示public
}应用实例某金融理财手机APP具有理财功能每位用户在其中会开通个人账户(Account)APP用户账户存在三种状态在不同状态下账户存在不同的行为如果账户中余额大于等于0则账户的状态为正常状态(Normal
如果账户中余额小于0并且大于-10000则账户的状态为透支状态(Overdraft
State)此时用户既可以向该账户存款也可以从该账户取款但需要按天计算利息如果账户中余额等于-10000那么账户的状态为受限状态(Restricted
State)此时用户只能向该账户存款不能再从中取款同时也将按天计算利息。
还有最后一种情况如果取款导致金额小于10000元了怎么办我们这里要规定一下如果小于这个数马上宣布不正常状态不准用户操作。
Check()用于在每一次执行存款和取款操作后根据余额来判断是否要进行状态转换并实现状态转换相同的方法在不同的状态中可能会有不同的实现。
为了实现不同状态下对象的各种行为以及对象状态之间的相互转化。
1Account:银行账户,环境类package
//设置初始状态System.out.println(this.owner
//调用状态对象的deposit()方法System.out.println(余额为
this.balance);System.out.println(帐户状态为
this.state.getClass().getName());}public
amount);state.withdraw(amount);
//调用状态对象的withdraw()方法System.out.println(余额为
this.balance);System.out.println(帐户状态为
}2AccountState:账户状态类抽象状态类package
Interest(){System.out.println(正常状态);}//状态转换public
Interest(){System.out.println(利息数额);}//状态转换public
{System.out.println(不能);}public
Interest(){System.out.println(利息数额);}//状态转换public
Account(小牛,0.0);cp.deposit(5000);cp.withdraw(10000);cp.deposit(6000);cp.withdraw(4000);cp.Interest();}
}这篇设计模式文章是我写的最累的一篇了写到这里已经很晚了实在写不动了。
输出结果大家自行推理就是了。
无非就是随着用户又取钱又存钱的导致银行帐户出现各类状态转换问题。
状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中通过设置不同的状态对象可以让环境对象拥有不同的行为而状态转换的细节对于客户端而言是透明的方便了客户端的使用。
在实际开发中状态模式具有较高的使用频率在工作流和游戏开发中状态模式都得到了广泛的应用例如公文状态的转换、游戏中角色的升级等。
各位小伙伴这次我们就说到这里下次我们再深入研究windows环境下的各类设计模式实现。
作者简介荔园微风1981年生高级工程师浙大工学硕士软件工程项目主管做过程序员、软件设计师、系统架构师早期的Windows程序员Visual
Studio忠实用户C/C使用者是一位在计算机界学习、拼搏、奋斗了25年的老将经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代我不知道未来还会有什么时代只记得这一路走来充满着艰辛与收获愿同大家一起走下去充满希望的走下去。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback