zoukankan      html  css  js  c++  java
  • 设计模式之状态

    状态模式介绍

    状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。

    根据状态不同,行为也不同

    状态模式描述的是一个行为下的多种状态变更,比如我们最常见的一个网站的页面,在你登录与不登录时,用户看到的页面是不同的,而这种登录与不登录就是我们通过改变状态而让整个行为发生了变化。

    状态模式建议为对象的所有可能状态新建一个类,然后将所有状态的对应行为抽取到这些类中。

    原始对象被称为上下文,它并不会自行实现所有行为,而是会保存一个指向表示当前状态对象的引用,且将所有与状态相关的工作委派给该对象。

    状态模式结构

    • 1、上下文

    保存对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。

    • 2、状态接口

    会声明特定于状态的方法,这些方法应能被其他所有具体状态所理解,因为你不希望某些状态所拥有的方法永远不会被调用。

    • 3、具体状态

    会自行实现特定于状态的方法。为了避免多个状态中包含相似代码,你可以提供一个封装有部分通用行为的中间抽象类。

    • 4、业务逻辑

    上下文和具体状态都可以设置上下文的下个状态,并可通过替代连接到上下文的状态对象来完成实际的状态转换。

    状态模式的应用场景

    • 对象需要根据自身当前状态进行不同行为,同时状态的数量非常多且与状态相关的代码会频繁变更的话。
    • 某个类需要根据成员变量的当前值改变自身行为,从而需要使用大量的条件语句时。
    • 当相似状态和基于条件的状态机转换中存在许多重复代码时,可使用状态模式。

    实现方式

    • 确定那些类是上下文,声明状态接口。
    • 为每个实际状态创建一个继承与状态接口的类,然后检查上下文中的方法并将与特定状态相关的所有代码抽取到新建的类中。
    • 在上下文类中添加状态接口类型的引用成员变量。
    • 再次检查上下文中的方法,将空的条件语句替换为响应的状态对象方法。
    • 传递上下文状态。

    满足单一职责原则和开闭原则。

    Demo

    该模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。

    状态模式可通过受外部控制且能根据对象状态改变行为的方法来识别。

    抽象的状态类

    抽象的状态类

    实现抽象状态类

    抽象实现类

    上下文类
    上下文类

    客户端调用

    客户端代码

    输出结果

    对于状态模式来说,还是得根据具体得业务场景去实现,就是当某个状态改变时,对应业务中有好多耦合得类也得对应做不同得变化时就可以使用状态模式。

    小寄语

    人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

    原创不易,给个关注。

    我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。

    作者:阿辉
    关注我:微信扫描下面二维码,关注后6T编程资料免费送。
    微信公众号:Andy阿辉
    写一些程序员的所思所想,希望对你有帮助。

    版权声明:本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    VS.NET2005中的源代码管理
    IE6升级后需要激活ActiveX控件的解决办法
    SQL Server的数据库开发工具
    今天更新了ActiveSync4.2
    永远等你先挂电话
    这回软设考试通过了!
    在Windows2003中FSO组件不能使用的问题
    七天的假期好长哟!
    发现博客园的一个Bug 存为草稿后就找不到了
    MySQL服务不能启动的解决方法
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/15179697.html
Copyright © 2011-2022 走看看