设计模式之------状态者模式(State Pattern)

一、概念

①、什么是状态者模式?

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

②、主要解决什么问题?

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

③、如何解决?

将各种具体的类抽象出来。

④、应用实例?

打篮球的时候运行员可以有正常状态、不正常状态和超长状态。

⑤、使用场景?

1、行为随状态改变而改变的场景。

2、条件、分支语句的代替者。

⑥、优缺点?

优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

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

二、图

①、结构图

②、拓展图

三、代码

①、类图

②、代码

客户端

class Program
    {
        static void Main(string[] args)
        {
            Work work = new Work();      //用工作类实例化一个工作对象work,初始状态为上午状态
            work.Hour = 9;               //给work对象的Hour属性进行赋值
            work.WriteProgram();         //调取work对象写程序方法
            work.Hour = 12;
            work.WriteProgram();
            work.Hour = 14;
            work.WriteProgram();
            work.Hour = 17;

            work.TaskFinished = false;   //工作未完成
            work.WriteProgram();
            work.Hour = 19;
            work.WriteProgram();
            work.Hour = 22;
            work.WriteProgram();
            Console.Read();
        }
    }

抽象状态类

    public abstract class State
    {
        public abstract void WriteProgram(Work w);   //创建抽象写程序方法,参数为工作类的具体对象        
    }

具体工作状态类(以上午工作状态为例)

    public class ForenoonState:State
    {
        public override void WriteProgram(Work w)
        {
            if(w.Hour<12)                                                            //如果工作时间小于12个小时
            {
                Console.WriteLine("当前时间:{0}点 上午工作,精神百倍", w.Hour);        //在控制台内写入内容
            }
            else                                                                     //否则
            {
                w.SetState(new NoonState());                                         //设置工作状态为下一个状态
                w.WriteProgram();
            }
        }
    }

工作类

public class Work
    {
        private State current;
        public  Work()
        {
            current = new ForenoonState();
        }
        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()        //Work类的写程序方法
        {
            current.WriteProgram(this);   //方法调取方法,此处为调取当前状态的写程序方法:this代表的是当下这个工作类,含依附于的所有属性内容
        }
    }

四、拓展

https://www.cnblogs.com/guyun/p/6197956.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsa~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值