[学习笔记:设计模式] 20_状态模式

定义 :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。


状态模式包含如下3个角色:

- Context(环境类):在Context类中维护一个抽象状态类State的实例,这个实例定义了当前状态。

- State(抽象状态类):定义一个接口以封装使用Context的一个特定状态相关的行为。

- ConcreteState(具体状态类):实现抽象状态定义的接口。每一个子类实现一个与Context的一个状态相关的行为。


举例
红绿灯的交替变化

- 环境类

public class Context
    {
        private State state;

        //设置默认状态
        public Context()
        {
            state = new ConcreteStateA();
        }

        //设置(切换)状态
        public void SetState(State state)
        {
            this.state = state;
        }

        //供客户使用的方法
        public void Request()
        {
            state.Handle(this);
        }
    }

- 抽象状态类

public abstract class State
    {
        //不同状态下都要用的方法(实现不同)
        public abstract void Handle(Context context);
    }

- 具体状态类

public class ConcreteStateA : State
    {
        public override void Handle(Context context)
        {
            Console.WriteLine("绿灯");

            //直接切换状态
            context.SetState(new ConcreteStateB());
        }
    }

    public class ConcreteStateB : State
    {
        public override void Handle(Context context)
        {
            Console.WriteLine("黄灯");

            context.SetState(new ConcreteStateC());
        }
    }

    public class ConcreteStateC : State
    {
        public override void Handle(Context context)
        {
            Console.WriteLine("红灯");

            context.SetState(new ConcreteStateA());
        }
    }

- 客户类

class Program
    {
        static void Main(string[] args)
        {
            Context context = new Context();

            //每次调用状态都在改变
            context.Request();
            context.Request();
            context.Request();
            context.Request();
        }
    }


总结:环境类中创建一个状态对象,构造函数中设置默认状态,还有切换状态的set方法,同时提供客户使用的方法,在该方法中调用当前状态的行为,具体状态类中若传入环境类对象,则可以使用环境类中切换状态的方法来改变当前状态。

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值