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

    概述:

            状态模式允许一个对象在其内部状态改变的时候改变其行为,

            在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
                适用性
    在下面的两种情况下均可使用State模式:
    if else(或switch case)语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。
     
    模式的组成

    环境类(Context):  定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
    抽象状态类(State):  定义一个接口以封装与Context的一个特定状态相关的行为。
    具体状态类(ConcreteState):  每一子类实现一个与Context的一个状态相关的行为

     
    状态模式应用的例子:TCPconnection
    class TcpConnection {
        private TcpState state;
        
        public void setState(TcpState state) {
            this.state = state;
        }
        void open(){
            state.open();
        }
        void close(){
            state.close();
        }
        void acknowledge(){
            state.acknowledge();
        }
    }
    
    interface TcpState {
        void open();
        void close();
        void acknowledge();
    }
    
    class TcpEstablished implements TcpState {
    
        @Override
        public void open() {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void close() {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void acknowledge() {
            // TODO Auto-generated method stub
            
        }
    }
    View Code

    状态模式的优点:
    1 ) 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来:

    2) 它使得状态转换显式化: 当一个对象仅以内部数据值来定义当前状态时 , 其状态仅表现为对一些变量的赋值,这不够明确。

    3) State对象可被共享 如果State对象没有实例变量—即它们表示的状态完全以它们的类型来编码—那么各Context对象可以共享一个State对象。当状态以这种方式被共享时, 它们必然是没有内部状态, 只有行为的轻量级对象。

    状态模式的缺点:
    1) 状态模式的使用必然会增加系统类和对象的个数。
    2) 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

     

  • 相关阅读:
    OpenGL播放yuv视频
    windows 播放器(wzplayer)
    Lotus中的保留域
    Domino Attachment and Object Service (DAOS)
    关于MyEclipse
    DB2站点荟萃
    @IsMember用法
    深入浅出SharePoint——解读Sharepoint日志之输出缓存
    UML用例图概要
    表单设计中的网页视觉体验
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7494305.html
Copyright © 2011-2022 走看看