状态模式——打工人一天的状态变化

简介: 状态模式——打工人一天的状态变化

  状态模式(State)定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

  什么是状态:

  应用程序中的部分对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态


  优点

  • 将与特定状态相关的行为放到该状态中,并且将不同状态下的行为分割开来,消除了选择语句,满足“单一职责原则”
  • 将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
  • 状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。


  缺点

  • 必然会增加系统的类与对象的个数。
  • 结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
  • 不利于实现开闭原则,对于可以切换状态的状态模式,增加新的状态类需要修改那些负- 责状态转换的源码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源码。


  模式的结构

环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。


抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。


具体状态(Concrete State)角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。

  代码背景:打工人从早到晚打工的精神状态。

抽象状态类:

public abstract class State
    {
        public abstract void WriteProgram(Work w);
    }

具体状态类:

    //上午工作状态
    public class ForenoonState : State
    {
        public override void WriteProgram(Work w)
        {
            if (w.Hour < 12)
            {
                Console.WriteLine("当前时间:{0}点 上午工作,精神百倍",w.Hour);
            }
            else
            {
                w.SetState(new NoonState());w.WriteProgram();
            }
        }
    }
    //中午工作状态
    public class NoonState : State
    {
        public override void WriteProgram(Work w)
        {
            if (w.Hour < 13)
            {
                Console.WriteLine("当前时间:{0}点 饿了,想吃饭;犯困,想睡觉。", w.Hour);
            }
            else
            {
                w.SetState(new AfternoonState()); w.WriteProgram();
            }
        }
    }
    //下午工作状态
    public class AfternoonState : State
    {
        public override void WriteProgram(Work w)
        {
            if (w.Hour < 17)
            {
                Console.WriteLine("当前时间:{0}点 下午状态还不错,继续努力", w.Hour);
            }
            else
            {
                w.SetState(new EveningState()); w.WriteProgram();
            }
        }
    }
    //晚上工作状态
    public class EveningState : State
    {
        public override void WriteProgram(Work w)
        {
            if (w.TaskFinished)
            {
                w.SetState(new RestState());w.WriteProgram();//完成任务就转成下班状态
            }
            else
            {
                if (w.Hour <21)
                {
                    Console.WriteLine("当前时间:{0}点 加班了,加班人累啊", w.Hour);
                }
                else 
                {
                    w.SetState(new SleepingState()); w.WriteProgram();//超过21点,转入睡眠状态
                }
            }
        }
    }
    //睡眠状态
    public class SleepingState:State
    {
        public override void WriteProgram(Work w)
        {
            Console.WriteLine("当前时间:{0}点 不行了,睡着了", w.Hour);
        }
    }
    //下班休息状态
    public class RestState : State
    {
        public override void WriteProgram(Work w)
        {
            Console.WriteLine("当前时间:{0}点 不行了,睡着了", w.Hour);
        }
    }

工作类(环境类):

    public class Work
    {
        private State current;
        public Work()
        {
            current = new ForenoonState();  //初始化为上午9点开始上班
        }
        private double hour;
        public double Hour  //小时钟,状态转换的依据
        {
            get { return hour; }
            set { hour = value; }
        }
        private bool finish = false;
        public bool TaskFinished  //完成任务属性,是否能下班的依据
        {
            get { return finish; }
            set { finish = value; }
        }
        public void SetState(State s) //得到状态
        {
            current = s;
        }
        public void WriteProgram() 
        {
            current.WriteProgram(this);
        }
    }

客户端:

        static void Main(string[] args)
        {
            Work emergencyProjects = new Work();
            emergencyProjects.Hour = 9;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 10;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 12;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 13;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 14;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 17;
            emergencyProjects.TaskFinished = false;//未完成任务,加班
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 19;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 22;
            emergencyProjects.WriteProgram();
            Console.Read();       
        }

相关文章
|
3月前
|
人工智能 达摩院 自然语言处理
类与类之间的协作模式问题之策略模式影响我们在工作中决策过程的问题如何解决
类与类之间的协作模式问题之策略模式影响我们在工作中决策过程的问题如何解决
|
4月前
|
测试技术
软件复用问题之捕捉领域变化,如何解决
软件复用问题之捕捉领域变化,如何解决
|
6月前
|
监控
观察者效应
观察者效应
130 2
|
6月前
|
设计模式 消息中间件 供应链
捕捉变化的风-用观察者模式提升用户体验
观察者模式是一种行为设计模式,允许对象之间定义一种订阅机制,以便在对象状态变化时通知多个观察者。它广泛应用于实现动态事件处理系统、用户界面元素的交互,或监测状态变化等场景。 文章中通过丰富的场景案例,展示了不使用观察者模式可能带来的问题,如紧耦合和难以维护;接着解释了如何应用观察者模式成功解决这些问题,通过主题和观察者的解耦,增强系统的灵活性和可扩展性。 进一步解释了观察者模式的工作原理,并介绍了其结构图和运行机制。该模式有助于在维护一致性和实时性方面提供优势,同时促使我们在高层次上分类对象间的交互。 最后
91 0
捕捉变化的风-用观察者模式提升用户体验
|
Java 调度
线程包括哪些状态,状态之间是如何变化的
线程包括哪些状态,状态之间是如何变化的
76 0
|
前端开发
调和阶段中setState内部干了什么?
调和阶段中setState内部干了什么?
56 0
|
设计模式 算法
代码小变化带来的大不同
代码小变化带来的大不同
62 0
|
6月前
|
设计模式
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
|
设计模式 Java uml
状态模式 电梯
状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将对象的行为封装到不同的状态类中,每个状态类都实现了对象在该状态下具体的行为。当对象的状态发生改变时,它会自动切换到相应的状态类,从而改变它的行为。
77 1
|
设计模式 Java
状态切换:解析Java设计模式中的状态模式
在软件开发领域,设计模式是一组经过验证的最佳实践方法,用于解决各种常见问题。状态模式是一种行为型设计模式,其目标是将对象的不同状态抽象成不同的状态类,并允许对象在不同状态间进行切换。在本文中,我们将深入了解状态模式的核心思想、应用场景以及它在Java中的实际运用。
238 0