博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
状态——对象行为模式
阅读量:2381 次
发布时间:2019-05-10

本文共 2352 字,大约阅读时间需要 7 分钟。

意图

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


动机

主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。


适用性

1) 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。

2) 代码中包含大量与对象状态有关的条件语句:一个操作中含有庞大的多分支的条件(if else(或switch case)语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常 , 有多个操作包含这一相同的条件结构。 State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。


结构图

这里写图片描述

角色

环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。

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


实现

///     /// 电灯类,对应模式中的Context类    ///     public class Light    {        private LightState state;        public Light(LightState state)        {            this.state = state;        }        ///         /// 按下电灯开关        ///         public void PressSwich()        {            state.PressSwich(this);        }        public LightState State        {            get { return state; }            set { state = value; }        }        }    ///     /// 抽象的电灯状态类,相当于State类    ///     public abstract class LightState    {        public abstract void PressSwich(Light light);    }    ///     /// 具体状态类, 开    ///     public class On : LightState    {        ///         /// 在开状态下,按下开关则切换到关的状态。        ///         ///         public override void PressSwich(Light light)        {            Console.WriteLine("Turn off the light.");            light.State = new Off();        }    }    ///     /// 具体状态类,关    ///     public class Off: LightState    {        ///         /// 在关状态下,按下开关则打开电灯。        ///         ///         public override void PressSwich(Light light)        {            Console.WriteLine("Turn on the light.");            light.State = new On();        }    }

客户端代码

class Program    {
static void Main(string[] args) { // 初始化电灯,原始状态为关 Light light = new Light(new Off()); // 第一次按下开关,打开电灯 light.PressSwich(); // 第二次按下开关,关闭电灯 light.PressSwich(); Console.Read(); } }

执行结果

Turn on the light

Turn off the light


优缺点

优点

状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

State对象可被共享 如果State对象没有实例变量—即它们表示的状态完全以它们的类型来编码—那么各Context对象可以共享一个State对象。当状态以这种方式被共享时, 它们必然是没有内部状态, 只有行为的轻量级对象。

缺点

导致较多的ConcreteState子类

状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

你可能感兴趣的文章
Linux下访问内存物理地址
查看>>
mmap测试程序
查看>>
linux 启动详解
查看>>
在linux内核中操作文件的方法
查看>>
Linux下Socket编程
查看>>
Linux内核和用户空间通信的方式— proc文件和mmap共享内存
查看>>
基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案
查看>>
CCS开发环境搭建小结
查看>>
DM642 gel文件和.cmd文件参考
查看>>
DSP软件优化小实验
查看>>
DSP/BIOS 介绍
查看>>
多线程编程之重点--使用DSP/BIOS时选择线程类型的参考方法
查看>>
DSP/BIOS在嵌入式数据采集系统中的应用
查看>>
基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案
查看>>
迅雷C++试题及解答
查看>>
Linux 中断学习之小试牛刀篇
查看>>
中断之原理篇
查看>>
高内聚 低耦合
查看>>
GUI开发之DirectFB
查看>>
GTK/DirectFB两个闪烁的问题
查看>>