状态模式

设计模式学习笔记-状态模式

蹲街弑〆低调 提交于 2019-12-25 18:34:52
1. 概述   当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 2. 解决的问题   主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。 3. 模式中的角色   3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。   3.2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。   3.3 具体状态(Concrete State):实现抽象状态定义的接口。 4. 模式解读   4.1 状态模式的类图      4.2 状态模式的代码实现 /// <summary> /// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。 /// </summary> public class Context { private State state; /// <summary> /// 定义Context的初始状态 /// </summary> /// <param name="state"></param> public Context(State state) { this.state =

状态模式实例

久未见 提交于 2019-12-22 09:27:48
用户需求: 设计思路: 1.UML图 具体代码实现: 抽象状态类 AccountState类 public abstract class AccountState { protected clubAccount Account; //存款 public abstract void Deposit(double amount); //消费 public abstract void Consume(double amount); //检查账户状态 public abstract void StateCheck(); }   具体状态类 VistorState类 public class VistorState : AccountState { public VistorState(clubAccount account) { Account = account; } public override void Deposit(double amount) { Account.Balance += amount; Console.WriteLine("向名为"+Account.Owner+"的账户中存款"+amount+"元,存款后账户余额为"+Account.Balance+"元"); StateCheck(); } public override void Consume(double

设计模式のStatePattern(状态模式)----行为模式

心已入冬 提交于 2019-12-22 09:27:29
一、产生背景 在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为。如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构的混乱。在这种情况下,就可以使用状态模式来解决问题。 二、实现方式 如何解决: 将各种具体的状态类抽象出来。 关键代码: 通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。 三、代码实例 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StatePattern { class Program { static void Main(string[] args) { Light light = new Light(); light.PressSwtich(); light.PressSwtich(); light.PressSwtich()

状态模式

你说的曾经没有我的故事 提交于 2019-12-22 09:27:12
来自:http://www.runoob.com/design-pattern/state-pattern.html 另一个参考:https://www.cnblogs.com/ysw-go/p/5404918.html 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决: 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用: 代码中包含大量与对象状态有关的条件语句。 如何解决: 将各种具体的状态类抽象出来。 关键代码: 通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。 应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。 2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context

JS设计模式(13)状态模式

百般思念 提交于 2019-12-22 09:26:54
什么是状态模式? 定义 :将事物内部的每个状态分别封装成类,内部状态改变会产生不同行为。 主要解决: 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用: 代码中包含大量与对象状态有关的条件语句。 如何解决: 将各种具体的状态类抽象出来。 应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。 2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。 优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。 缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。 使用场景: 1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。

设计模式2——状态模式State

僤鯓⒐⒋嵵緔 提交于 2019-12-22 09:26:38
参考链接: 设计模式之状态模式: https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式: https://www.jianshu.com/p/67ad1915fd62 状态模式,这种类型的设计模式属于行为型模式。 在状态模式中,类的行为是基于它的状态改变的。 我们创建 表示各种状态的对象 和一个行为随着状态对象改变而改变的 context 对象 。 状态模式的目的 : 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 解决的问题和使用的场景 : 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 代码中包含大量与对象状态有关的条件语句。 行为随状态改变而改变的场景。 条件、分支语句的代替者。 优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。 缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对

【设计模式】状态模式

僤鯓⒐⒋嵵緔 提交于 2019-12-22 09:26:25
状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决: 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用: 代码中包含大量与对象状态有关的条件语句。 如何解决: 将各种具体的状态类抽象出来。 关键代码: 通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。 应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。 2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。 优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4

状态模式

送分小仙女□ 提交于 2019-12-22 09:26:06
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决: 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用: 代码中包含大量与对象状态有关的条件语句。 如何解决: 将各种具体的状态类抽象出来。 关键代码: 通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。 应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。 2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。 优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4

状态模式

半世苍凉 提交于 2019-12-22 09:25:53
标签(空格分隔): 设计模式 行为型模式。 类的行为是基于它的状态改变的,状态改变,行为跟着改变。 具体实现: 一个状态接口,具体状态类实现该接口。 一个Context类,拥有状态的实例,随着这个状态的改变,它的行为会改变。 注重状态的转变,状态只能从一个状态转变按规则转变成另一个状态,而不是任意转换。例如房间只能从未预订变成预订。 类图结构 角色: 环境类 (Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。 抽象状态类 (State): 定义一个接口以封装与Context的一个特定状态相关的行为。 具体状态类 (ConcreteState): 每一子类实现一个与Context的一个状态相关的行为。 把状态封装成一个类,状态的改变只需要传入不同的具体state实现即可。 当一个对象的行为取决于它的状态,并且它必须在 运行时刻 根据状态改变它的行为时,就可以考虑使用状态模式来。 State模式将所有与一个特定的状态相关的行为都放入一个对象(具体state)中。 应用场景: 电灯开关,按一下,状态变成开灯,再按一下,状态变成关灯。 网上投票,投一次,正常。再投,变成反复投票。再投,取消当次投票资格。再投,系统拉黑,以后再也不能投。 酒店订房系统,房间有预订、入住、退订、退房多种状态。 优点: 新增状态时

状态模式(State)

倖福魔咒の 提交于 2019-12-22 09:25:38
1、概念 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类,属于行为型模式。 2、模式结构 环境角色(Context):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。 抽象状态角色(State):定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。 具体状态角色(ConcreteState):每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。 3、使用场景 对象的行为依赖于它的某些属性值,状态的改变将导致行为的变化 在代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,并且导致客户类与类库之间的耦合增强 4、优缺点 优点: 封装了转换规则 枚举可能的状态,在枚举状态之前需要确定状态种类 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数 缺点: 增加系统类和对象的个数 结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱 对"开闭原则"的支持并不太好,对于可以切换状态的状态模式