状态模式——状态改变行为

小编复习软考,遇到了很多模式,其中一个很有意思的就是状态模式,下面就有小编来给大家介绍一下。

what

普遍定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来形式改变了其类

自己总结:对象的行为随着状态改变

when

那么何时使用呢?这个根据定义就可知道,当对象的行为根据状态变化,并且在运行时刻根据状态变化,就考略用状态模式.也可以说,当一个对象的转换条件过于复杂的时候,使用这个模式可以使逻辑简化。

why

为什么使用呢?这个其实还是把变化的抽离出来,就是讲不同行为的状态分离出来

思考:

1、this在里面代表什么

2、state是从什么地方引用过来的

3、章台的该bain是hi怎样引起行为的改变的

4、为什么用Context作为State抽象类方法里的参数


demo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 状态模式
{
    class Program
    {
        //当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变其类  
        static void Main(string[] args)
        {
            Context C = new Context(new ConcreteStateA());
            C.Request();
            C.Request();
            C.Request();
            Console.Read();

        }
        abstract class State
        {
            public abstract void Handle(Context context);//为什么? 体现聚合,State调用Context
        }

        class ConcreteStateA : State
        {
            public override void Handle(Context context)
            {
                context.state = new ConcreteStateB();
            }
        }
        class ConcreteStateB : State
        {
            public override void Handle(Context context)
            {
                context.state = new ConcreteStateA();
            }
        }
        


        class Context
        {
            public  State state;//为什么设置私有
            
            public Context(State state)
            {
                this.state = state;//体现聚合,定义Context初始状态
            }
            public void Request()
            {
                state.Handle(this);//为什么参数用this?   对请求做处理,并设置下一状态
            }
            
            public State State//可读写的状态属性, 用于读取当前状态和设置新状态  为什么添加这个?
            {
                get { return state; }
                set
                {

                    state = value;
                    Console.WriteLine("当前状态:" + state.GetType().Name);
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yanwenwennihao/article/details/80296679