状态模式(State)

简介: 状态模式(State)

什么是状态模式?

对一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。


5c98b798ceb45aef67c3aa0aaefa8575.png


Context:维护一个ConcreteState子类的实例,这个实例定义当前的状态;(策略模式也有)


ConcreteStateA:具体状态,每一个子类实现一个与Context的状态相关的行为;


State:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为


核心:初始状态是灵活的,可以指定是A也可以指定是B,任意一个状态对程序都没有影响。但重构中用户登录使用状态模式的话,登陆的流程是强制的,初始状态不能随意指定。


有什么优点?

满足单一职责原则。将与特定状态相关的行为局部化,并且将不同状态的行为分割开来;


满足开闭原则;


消除庞大的条件分支语句。状态模式把各种状态转移逻辑分布到State的子类之间,减少相互间的依赖;


有什么缺点?

状态模式的使用必然会增加系统的类与对象的个数


什么时候适用?

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。、


代码展示

场景:在一天的工作中,不同的时间段每个人的工作状态是不一样的,工作效率也不同,比方说:上午状态好、中午想睡觉、下午渐恢复、加班苦煎熬。其实是一种状态的变化,不同的时间,会有不同的状态。根据时间的不同,做出判断


①、状态模式


86c95454bf1feaf9774101ef1e5a855f.png


State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为

//State类,抽象状态类
    //定义一个接口以封装与Context的一个特定状态相关的行为
    abstract class State
    {
        public abstract void Handle(Context context);
    }

ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为

//ConcreteState类
    //具体状态,每一个子类实现一个与Context的一个状态相关的行为
    class ConcreteStateA : State
    {
        public ConcreteStateA() { }   //构造方法
        public override void Handle (Context context)   //重写抽象类方法
        {
            context.State = new ConcreteStateB();       //设置ConcreteStateA的下一状态是ConcreteStateB
        }
    }
    class ConcreteStateB : State 
    {
        public ConcreteStateB() { }
        public override void Handle (Context context)    //重写抽象类方法
        {
            context.State = new ConcreteStateA();       //设置ConcreteStateA的下一状态是ConcreteStateA
        }
    }

Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态

//Context类
    class Context
    {
        private State state;         //成员变量,关联关系
        public Context (State state)   //构造方法,聚合关系
        {
            this.state = state;           //定义Context的初始状态
        }
        public State State              //可读写的状态属性,用于读取当前状态和设置新状态
        {
            get { return state; }        //读
            set                             //写
            {
                state = value;
                Console.WriteLine("当前状态:" + state.GetType().Name);
            }
        }
        public void Request()       //对请求做处理,并设置下一状态
        {
            state.Handle(this);         //调用Handle方法
        }
    }
目录
相关文章
|
6月前
|
设计模式
设计模式之 State(状态模式)
设计模式之 State(状态模式)
41 0
|
6月前
|
设计模式 程序员
设计模式-状态模式(State)
设计模式-状态模式(State)
60 0
|
设计模式
设计模式~状态模式(state)-23
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的context对象。 目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: 代码
64 1
|
设计模式
设计模式19 - 状态模式【State Pattern】
设计模式19 - 状态模式【State Pattern】
43 0
|
设计模式 Java
Java设计模式-状态模式(State)
Java设计模式-状态模式(State)
|
设计模式 Java 编译器
设计模式学习(五):State状态模式
在面向对象编程中,是用类表示对象的。也就是说,程序的设计者需要考虑用类来表示什么东西。类对应的东西可能存在于真实世界中,也可能不存在于真实世界中。
157 0
设计模式学习(五):State状态模式
|
设计模式 存储
行为型-State
在实际的软件开发中,状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。从这一点上来看,它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。不过,状态机的实现方式有多种,除了状态模式,比较常用的还有分支逻辑法和查表法。今天,我们就详细讲讲这几种实现方式,并且对比一下它们的优劣和应用场景。
153 0
行为型-State
|
设计模式 Java
浅谈JAVA设计模式之——状态模式(State)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
186 0
浅谈JAVA设计模式之——状态模式(State)
状态模式(State)
结构 UML.png 模式的组成 环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
897 0