设计模式——状态模式

设计模式,行为模式之状态模式 1 概述 状态模式(state Pattern)是行为模式之一,一般用在对象的行为依赖于内部状态的场景。 2 状态模式 考虑一个场景:对象有状态,而且根据状态不同,对象的行为也会不同。对于该情况,最简单的方式是,对状态做if-else或者swith-case判断,根据状态调用相应的行为。但是这种做法,把对象和状态耦合在了一起,难于扩展和维护。更好的做法是,用状态模式状态抽离出来形成一个接口,而目标对象依赖该状态接口,来完成对应的行为,由此达到解耦的目的。 状态模式跟策略模式非常相像,可视为策略模式的扩展。 阅读详情

初识

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
顾名思义,我们学习包括做其他事情时,都会有自己的状态,状态好,效率好,状态不好,困了,效率低下。这就是内在状态改变了其行为,看起来像是改变了其类。

结构

在这里插入图片描述

角色:
Context类:维护一个ConcreteState子类的实例,这个实例定义当前的状态。
State类:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteState类:具体状态,每一个子类实现一个与Context的一个状态相关的行为。

应用

我们在打电话时,对方的手机会有几个状态:关机;占线;停机;销户。系统会根据对方手机的状态做出相应的行为。这就是典型的状态模式。我们看看是如何实现的!

在这里插入图片描述

class Program
{
    static void Main(string[] args)
    {
        Phone phone = new Phone();
        phone.Hour = 6;
        phone.CallPhone();

        phone.Hour = 10;
        phone.CallPhone();

        phone.Hour = 19;
        phone.CallPhone();

        phone.Hour = 22;
        phone.CallPhone();

        Console.Read();
    }
}

public abstract class State//抽象状态类
{
    public abstract void CallPhone(Phone p);
}

public class TurnOff:State//关机类
{
    public override void CallPhone(Phone p)
    {
        if (p.Hour<7)
        {
            Console.WriteLine("当前时间:{0}点 还未起床,未开机!",p.Hour);
        }
        else
        {
            p.SetState(new LineBusy());
            p.CallPhone();
        }
    }
}

public class LineBusy:State//占线类
{
    public override void CallPhone(Phone p)
    {
        if (p.Hour<11)
        {
            Console.WriteLine("当前时间:{0}点 工作忙,占线中!", p.Hour);
        }
        else
        {
            p.SetState(new DownTime());
            p.CallPhone();
        }
    }
}

public class DownTime:State//停机类
{
    public override void CallPhone(Phone p)
    {
        if (p.Hour<20)
        {
            Console.WriteLine("当前时间:{0}点 电话太多,停机了!", p.Hour);
        }
        else
        {
            p.SetState(new Logout());
            p.CallPhone();
        }
    }
}

public class Logout:State//注销类
{
    public override void CallPhone(Phone p)
    {
        if (p.Hour<23)
        {
            Console.WriteLine("当前时间:{0}点 没费了,注销吧!", p.Hour);
        }
    }
}

public class Phone
{
    private State current;

    public Phone()
    {
        current = new TurnOff();
    }

    private double hour;
    public double Hour
    {
        get { return hour; }
        set { hour = value; }
    }

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

    public void CallPhone()
    {
        current.CallPhone(this);
    }
}

优点

  • 体现了开闭原则和单一职责原则,每个状态都是一个子类,你要增加状态就要增加子类,你要修改状态,你只修改一个子类就可以了。
  • 符合迪米特法则。
  • 封装性非常好
  • 结构清晰,避免了过多的switch…case或者if…else语句的使用,避免了程序的复杂性,提高可维护性。

缺点

  • 会增加的类的数量。
  • 使系统的复杂性增加。

使用情景

  • 行为随状态的改变而改变。
  • 如果需要使用大量的条件、分支判断。
用户注册的四种状态 $.ajax({ url: $(this).attr('action'), type: 'POST', dataType: 'json', timeout: 6000, data: $(this).serialize(), beforeSend: function(xhr){ // 注册之前... 阅读详情

相关推荐

java设计模式---状态模式(State pattern)

java设计模式状态模式(State pattern) 1. 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状...

渔潭的博客 467

二十三种设计模式——状态模式(State Pattern)

状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使...

也曾北风温柔以待 542

设计模式二十三之状态StatePattern模式】状态模式StatePattern

解释器模式细说解释器模式细说解释器模式定义UML模型基于UML的代码场景一场景代码场景二场景代码解释器模式应用和注意事项 细说解释器模式 提示: 博主:章飞 _906285288的博客 博客地址:http://blog.csdn.net/qq_29924041 细说解释器模式 定义 UML模型 基于UML的代码 场景一 场景 代码 场景二 场景 代码 解释器模式应用和注意事项 欢迎继续...

章飞 _906285288的博客 869

23种设计模式状态模式(State Pattern)

本篇文章将23种设计模式中的状态模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 1万+

设计模式-状态模式-State Pattern

这种模式通过将状态相关的行为封装在独立的类中,并在运行时根据状态对象来切换这些行为,从而使得对象能够在内部状态变化时合理地更改其行为。状态模式的优点在于它将状态相关的行为封装在具体的状态类中,使得状态转换逻辑清晰,并且可以在运行时动态地改变对象的行为。状态模式的优点包括局部化了状态相关的操作,将状态转换逻辑封装在状态对象内部,以及可以在运行时切换对象的行为。:在没有使用状态模式的情况下,对象的状态管理可能需要大量的条件分支语句,状态模式可以将这些条件分支分散到不同的状态类中。

wesigj的博客 2001

设计模式——状态模式(State Pattern)

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

码鹿的记录 623

设计模式状态模式

设计模式是经验总结,是学习软件设计的有效方法,因此,了解和理解现有的设计模式,是提高软件设计的有效途径之一,这里将介绍相关的设计模式,并通过示例了理解其用法。本章主要介绍状态模式并进行示例。

ZhangCurie的博客 330

设计模式状态模式(State Pattern)

状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。

倔强老吕的博客 1195

设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。

设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。 文章目录设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。

lyfGeek的博客 134

设计模式24:State Pattern (状态模式)

英文原文:http://www.dofactory.com/Patterns/PatternState.aspx一、State Pattern (状态模式)Define: Allow an object to alter its behavior when its internal state changes. The object will appear to change its cl

薛敬明的专栏 1889

设计模式(Design pattern)之状态模式(state Pattern)

状态模式在电梯系统中的应用 该代码展示了状态模式在电梯控制系统中的实现。通过抽象StateElevator类定义四种操作(open/close/run/stop),并由四个具体状态类(Open/Run/Stop/Close)实现不同状态下的行为逻辑。Context类作为环境角色维护当前状态,各状态类可通过super.context改变状态。这种设计避免了大量条件判断,使状态转换清晰可见,但实际应用中可能存在状态类膨胀的问题。示例演示了电梯从开启状态开始,依次执行运行、开启、关闭和停止操作的状态转换过程。

RR1335 之代码才是动力源 215

JAVA设计模式状态模式【State Pattern】

一、概述     当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。状态模式是一种对象行为型模式。 二、适用场景     用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题。简单说就是处理对象的多种状态及其相互转换。

小吕丶Code阶区 3881

设计模式教程:状态模式(State Pattern)

允许一个对象在其内部状态改变时改变它的行为。对象将行为封装到不同的状态类中,并在状态改变时切换状态

遇见伯灵说的博客 1068

设计模式-状态模式(State Pattern)

状态模式 定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 类型 行为型。 UML类图 角色 环境(Context)角色:环境角色含有状态角色的对象,并且可以处理一些请求,这些请求最终产生的响应会与状态相关。 状态(State)角色:状态角色定义了每一个状态的行为接口,这些行为将会在Context中得以使用。 具体状态(ConcreteState)角色:实现了相关行为...

kaven 1230

23种设计模式----状态模式(State Pattern)

*状态模式(State Pattern)* **允许一个对象在其内部状态改变时自动改变其行为,对象看起来就像是改变了它的类。** 例子:黄灯改变会变成红灯,红灯改变会变成绿灯。 1)抽象状态类(State类):抽象状态类定义了一个具体状态类需要实现的行为约定。 2)具体状态类(...

u012075901的博客 330

设计模式状态模式(State Pattern)

设计模式中有六大原则和二十三设计模式。 其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则。 二十三设计模式:单例模式、Builder 模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式、备忘录模式、迭代器模式、模版方法模式、访问者模式、中介模式、代理模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式。

Mr_Four 539

[DesignPattern]StatePattern

状态模式基本常识:策略模式和状态模式是双胞胎,在出生时才分开。糖果机器,需要完成一个状态图。如果用程序状态机(PSM),太多的if,如果变更需求,会造成混乱的状态。因为我们没有遵循开放封闭原则,将不会改变的状态封装起来。状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 - 首先,我们定义一个State接口。在这个接口内,糖果机的每个动作都有一个对应的方法。 - 然后为机

xy_cpp的博客 258

设计模式 -- 状态模式(State Pattern)

允许一个对象在内部状态改变时改变它的行为。 应用场景 一个对象的行为取决于它的状态,并且它在运行时根据状态改变它的行为。 代码中包含大量与对象状态相关的判断语句。 优点: 将不同的状态隔离 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖 增加新的状态非常简单 状态模式与责任链模式的区别 状态模式和责任链模式都能消除 if-else 分支过多的问题。但在某些情况下,状态模式中的状态可以理解为责任,那么在这种情况下,两种模式都可以使用。

魔法师之家 1787
上一篇: 设计模式——备忘录模式
下一篇: 设计模式——访问者模式
「已注销」
博客等级 码龄9年 114粉丝 150原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值