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

    模式定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。

    模式结构:

    • Context: 环境类,定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
    • State: 抽象状态类,定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
    • ConcreteState: 具体状态类,每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

     

    在状态模式结构中需要理解环境类与抽象状态类的作用:

    • 环境类实际上就是拥有状态的对象,环境类有时候可以充当状态管理器(State Manager)的角色,可以在环境类中对状态进行切换操作。
    • 抽象状态类可以是抽象类,也可以是接口,不同状态类就是继承这个父类的不同子类,状态类的产生是由于环境类存在多个状态,同时还满足两个条件: 这些状态经常需要切换,在不同的状态下对象的行为不同。因此可以将不同对象下的行为单独提取出来封装在具体的状态类中,使得环境类对象在其内部状态改变时可以改变它的行为,对象看起来似乎修改了它的类,而实际上是由于切换到不同的具体状态类实现的。由于环境类可以设置为任一具体状态类,因此它针对抽象状态类进行编程,在程序运行时可以将任一具体状态类的对象设置到环境类中,从而使得环境类可以改变内部状态,并且改变行为。

    实例:

    from abc import ABCMeta, abstractmethod
    
    
    class Context:
        """环境角色"""
        def __init__(self):
            self._state_a = ConcreteStateA()
            self._state_b = ConcreteStateB()
    
        def request(self,sample_parameter):
            if sample_parameter == "A":
                self._state_a.handle(sample_parameter)
            else:
                self._state_b.handle(sample_parameter)
    
    
    class StateInterface(metaclass=ABCMeta):
        @abstractmethod
        def handle(self,sample_parameter):
            """
    
            :param sample_parameter:
            :return:
            """
    
    
    class ConcreteStateA(StateInterface):
        def handle(self,sample_parameter):
            print("ConcreteStateA handle:"+sample_parameter)
    
    
    class ConcreteStateB(StateInterface):
        def handle(self,sample_parameter):
            print("ConcreteStateB handle:"+sample_parameter)
    
    
    class Client:
        def main(self):
            context = Context()
            context.request("A")
            context.request("B")
    
    
    if __name__ == "__main__":
        client = Client()
        client.main()
    

      

      

     总结:状态模式和策略模式的不同点在于,客户端用具体状态配置一个环境,一旦配置完成就无需和状态打交道。客户端通常不负责运行期间状态的维护,也不负责决定后续到底使用哪一个具体的状态处理对象。而策略模式则将选择权交给客户端。

  • 相关阅读:
    浅谈C++ STL中的优先队列(priority_queue)
    哈夫曼树与哈夫曼编码
    Binary Search 的递归与迭代实现及STL中的搜索相关内容
    Prime 算法的简述
    估算网站需要多少宽带方法
    微服务服务拆分步骤
    第一次有人把科创板讲得这么简单明了
    一个人优秀到可怕的三个迹象!一旦具备,必为人中龙凤,大富大贵
    美元加息怎么“剪羊毛”
    英国脱欧的影响
  • 原文地址:https://www.cnblogs.com/zenan/p/10372898.html
Copyright © 2011-2022 走看看