美文网首页
状态变化模式

状态变化模式

作者: 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子类

    相关文章

      网友评论

          本文标题:状态变化模式

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