c#设计模式——状态模式

一 概要

1.1 行为型模式

  1. 特别关注对象之间的通信。描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。

1.2 定义

  1. 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

二 UML类图

在这里插入图片描述

三 例子

   public interface IState
    {
        void Handle(Context context);
    }

    public class Context
    {
        private IState state;

        public void SetState(IState state)
        {
            this.state = state;
        }

        public IState GetState()
        {
            return this.state;
        }

        public void Request()
        {
            this.state.Handle(this);
        }
           
    }

    public class StateA : IState
    {
        public void Handle(Context context)
        {
         //   if ("满足某个条件")
            {
                context.SetState(new StateB());
                context.Request();
            }
        }
    }

    public class StateB : IState
    {
        public void Handle(Context context)
        {
            //   if ("满足某个条件")
            {
                context.SetState(new StateC());
            }
        }
    }

    public class StateC : IState
    {
        public void Handle(Context context)
        {
            //   if ("满足某个条件")
            {
                context.SetState(new StateA());
            }
        }
    }

    public class Test
    {
        public Test()
        {
            Context context = new Context();
            context.SetState(new StateA());
            context.Request();
        }
    }

四 优缺点

4.1 优点

  1. 消除了庞大的条件分支语句, 把各种状态转移逻辑分布到State的子类之间。减少了相互间的依赖,使得代码更加容易维护和扩展。
  2. 状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。

4.2 缺点

1.每增加一个新的状态,都需要实现一个新的状态类, 如果该状态与原来的状态相关联,可能需要修改原来的状态类, 违背了开放封闭原则。

五 使用场景

  1. 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
  2. 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值