Statepattern

意图
允许一个对象在其内部状态改变时改变它的行为.

 

适用性
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为.
一个对象有不同的行为,这个行为是由它的状态来决定的,一个对象的状态是由它的
成员变量来决定的.
比如一个Person类,它有两个成员变量,一个姓名name,一个年龄age,当Person这个类
生成相应的对象之后,这个对象一旦名字或者年龄发生变化,我们说这个对象它的状态发
生了变化.如果它的成员变量都没有发生变化,那么这个对象就没有发生变化.

 

2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态.这个
状态通常用一个或多个枚举常量来表示.通常,有多个操作包含这一相同的结构.
State模式将每一个条件分支放入一个独立的类中.这使得你可以更具对象自身的情况
将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化.
也就是说在if-else这种情况下里面,每个if-else里面执行的代码都把它封装在相应的对象,
其中对象和对象之间是不会产生干扰的,它们变化是不影响其他对象的.

 

构成:
1.抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的
状态所对应的行为.

 

2.具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态
所对应的行为.

 

3.环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例.这个
具体状态类的实例给出此环境对象的现有状态.
换句话说,客户端是和环境角色打交道,环境角色向客户端提供了一种行为,是由具体的状态
角色来给我们提供的,相应的环境角色里会持有对状态角色的一个引用.

 

环境角色里会持有相应具体状态角色的一个引用,当具体状态发生变化的时候,环境角色对外提供
的接口也发生了变化,因为底层维护着具体状态行为发生的变化,而每一个具体状态所对应的
行为又是不一样的,所以导致环境角色对外提供的接口发生了变化.

 

ClassDiagram:

 

SequenceDiagram:

 

 class Clinet
    {
        static void Main(string[] args)
        {
            Car c = new Car();
            c.Pull();
            c.Pull();
            c.Pull();
            c.Pull();
            Console.ReadKey();
        }
    }

    /// <summary>
    /// 环境角色
    /// </summary>
    abstract class State
    {
        public abstract void pull(Car car);
    }

    /// <summary>
    /// 环境角色
    /// </summary>
    class Car
    {
        private State current;

        public Car()
        {
            current = new Off();
            Console.WriteLine("新车生产出来了现在是空档!");
        }

        public void SetState(State state)
        {
            current = state;
        }

        public void Pull()
        {
            current.pull(this);
        }
    }

    class Off : State
    {
        public override void pull(Car car)
        {
            car.SetState(new Low());
            Console.WriteLine("低档");
        }
    }

    class Low : State
    {
        public override void pull(Car car)
        {
            car.SetState(new Midium());
            Console.WriteLine("中档");
        }
    }

    class Midium : State
    {
        public override void pull(Car car)
        {
            car.SetState(new High());
            Console.WriteLine("高档");
        }
    }

    class High : State
    {
        public override void pull(Car car)
        {
            car.SetState(new Off());
            Console.WriteLine("空档");
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值