美文网首页
状态变化模式

状态变化模式

作者: timber_wu | 来源:发表于2016-10-04 19:38 被阅读35次

在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。

典型模式

  • State
  • Menmento

State状态模式

动机

  • 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于之都状态,其支持的行为和读写状态支持的行为就可能完全不同。
  • 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合?

模式定义

允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。

结构

类图

模式中的角色:

  • 1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
  • 2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
  • 3 具体状态(Concrete State):实现抽象状态定义的接口。

状态模式的代码演示

    import sun.security.krb5.internal.NetClient;
    public abstract class NetworkState{
    
        public NetworkState next;//指针,指向下一状态
    
        public abstract void Operation1();
        public abstract void Operation2();
        public abstract void Operation3();
    / /抽象出三个方法
    }
    
    public class OpenState extends NetworkState{
    
    
        @Override
        public void Operation1(){
            
            //**********
            next = new CloseState();
        }
    
        @Override
        public void Operation2(){
            
            //..........
            next = new ConnectState();
        }
    
        @Override
        public void Operation3(){
            
            //$$$$$$$$$$
            next = new OpenState();
        }
    
    }
    
    public class CloseState extends NetworkState{
    
    
        @Override
        public void Operation1(){
    
            //**********
            next = new ConnectState();
        }
    
        @Override
        public void Operation2(){
    
            //..........
            next = new OpenState();
        }
    
        @Override
        public void Operation3(){
    
            //$$$$$$$$$$
            next = new CloseState();
        }
    
    }
    
    public class ConnectState extends NetworkState{ }
    
    public class WaitingState extends NetworkState{ }
    //...
    
    
    class NetworkProcessor{
        
        NetworkState state;
    
    
    
        public NetworkProcessor(NetworkState state){
            
            this.state = state;
        }

        public void Operation1(){
            //...
            state.Operation1();
            state = state.next;
            //...
        }
    
        public void Operation2(){
            //...
            state.Operation2();
            state = state.next;
            //...
        }
    
        public void Operation3(){
            //...
            state.Operation3();
            state = state.next;
            //...
        }
    
    }

模式总结

优点

  • 状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
  • 所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。
  • 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

缺点

  • 导致较多的ConcreteState子类

相关文章

  • 状态变化模式

    在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”...

  • Boolan 第十三周 设计模式(三)

    状态变化模式 典型模式 State Memento 1 state目的是应对对象状态变化,行为也要随之变化,保持对...

  • Android设计模式之(7)----状态模式

    状态模式 所谓状态模式,就是代表一个事物有多个状态。因为状态的变化而导致一系列的变化。 听起来和策略模式很相似,都...

  • 状态模式

    状态模式属于状态变化模式。由一个状态维持类来控制当前的状态,把不同的状态写成不同的派生类,当状态发生变化时,状态维...

  • 随时灵活变化-状态模式

    模式介绍 状态模式的结构和策略模式几乎一模一样。 但是它们两者的目的、本质却完全不同。 策略模式的行为是彼此独立,...

  • JS设计模式之状态模式

    # 什么是“状态模式”? 状态模式:对象行为是根据状态改变,而改变的。特点:正是由于内部状态的变化,导致对外的行为...

  • lxidea的 Boolan C++设计模式 学习笔记(三)

    本周的设计模式比较多了,主要分为“对象性能”模式,“状态变化”模式, 对象性能模式 Singleton单件模式 保...

  • 状态模式

    状态模式,定义:类内部变量(变化了)导致相关类的方法也会发生相关变化 写的时候记住口诀,状态》实现状态》持有状态 ...

  • 状态模式

    状态模式 一个对象有状态变化 每次状态变化都会触发一个逻辑 不能总是用 if...else 来控制 示例 交通灯信...

  • 备忘录模式

    备忘录模式属于状态变化模式。在状态发生改变时,使用备忘录记录当前的状态,如果需要回滚操作,则取出先前记录的状态。在...

网友评论

      本文标题:状态变化模式

      本文链接:https://www.haomeiwen.com/subject/ptfsyttx.html