行为型设计模式之状态模式(State)

结构
意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用性
  • 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。S t a t e模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

 1 using System;
 2
 3     abstract class State
 4     {
 5         protected string strStatename;
 6
 7         abstract public void Pour();
 8         // do something state-specific here
 9     }
10
11     class OpenedState : State
12     {
13         public OpenedState ()
14         {
15             strStatename = "Opened";
16         }
17         override public void Pour()
18         {
19             Console.WriteLine("...pouring...");
20             Console.WriteLine("...pouring...");
21             Console.WriteLine("...pouring...");
22         }
23     }
24
25     class ClosedState : State
26     {
27         public ClosedState()
28         {
29             strStatename = "Closed";
30         }
31         override public void Pour()
32         {
33             Console.WriteLine("ERROR - bottle is closed - cannot pour");
34         }
35     }
36
37     class ContextColaBottle
38     {
39         public enum BottleStateSetting {
40             Closed,
41             Opened
42         };
43
44         // If teh state classes had large amounts of instance data,
45         // we could dynamically create them as needed - if this demo
46         // they are tiny, so we just  create them as data members
47         OpenedState openedState = new OpenedState();
48         ClosedState closedState = new ClosedState();
49
50         public ContextColaBottle ()
51         {
52             // Initialize to closed
53             CurrentState = closedState;
54         }
55
56         private State CurrentState;
57
58         public void SetState(BottleStateSetting newState)
59         {
60             if (newState == BottleStateSetting.Closed)
61             {
62                 CurrentState = closedState;
63             }
64             else
65             {
66                 CurrentState = openedState;
67             }
68         }
69
70         public void Pour()
71         {
72             CurrentState.Pour();
73         }
74     }
75
76       /// <summary>
77     ///    Summary description for Client.
78     /// </summary>
79     public class Client
80     {
81         public static int Main(string[] args)
82         {
83             ContextColaBottle contextColaBottle = new ContextColaBottle();
84
85             Console.WriteLine("initial state is closed");
86
87             Console.WriteLine("Now trying to pour");
88               contextColaBottle.Pour();
89
90             Console.WriteLine("Open bottle");
91             contextColaBottle.SetState(ContextColaBottle.BottleStateSetting.Opened);
92
93             Console.WriteLine("Try to pour again");
94             contextColaBottle.Pour();
95
96             return 0;
97         }
98     }

状态模式

时间: 2024-07-29 00:35:22

行为型设计模式之状态模式(State)的相关文章

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 ( 十七) 状态模式State(对象行为型)

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

[设计模式] 20 状态模式 State Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对于一个对象的状态,我们都是让这个对象包含一个状态的属性,这个状态属性记录着对象的具体状态,根据状态的不同使用分支结构来执行不同的功能,就像上面的代码那样处理:就像上面说的,类中存在大量的结构类似的分支语句,变得难以维护和理解.状态模式消除了分支语句,就像工厂模式消除了简单工厂模式的分支语句一样,将状态处理分散

设计模式 笔记 状态模式 State

//---------------------------15/04/28---------------------------- //State  状态模式----对象行为型模式 /* 1:意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 2:别名: 状态对象(Objects for States) 3:动机: 4:使用性: 1>一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2>一个操作中含有庞大的多分支条件语句,且这些分支依赖于该

【设计模式】—— 状态模式State

前言:[模式总览]——————————by xingoo 模式意图 允许一个对象在内部改变它的状态,并根据不同的状态有不同的操作行为. 例如,水在固体.液体.气体是三种状态,但是展现在我们面前的确实不同的感觉.通过改变水的状态,就可以更改它的展现方式. 应用场景 1 当一个对象的行为,取决于它的状态时 2 当类结构中存在大量的分支,并且每个分支内部的动作抽象相同,可以当做一种状态来执行时. 模式结构 Context 环境角色,里面包含状态对象 class Context{ private Sta

设计模式之状态模式20170712

行为型设计模式之状态模式: 一.含义 为每个状态创建与之对应的类(对应的每个类实现同一个接口或继承同一个抽象类,便于统一处理),并且再通过一个类切换状态 二.代码说明 1.一般包含三个角色抽象状态角色,具体状态角色,以及环境(上下文)角色(负责具体状态的切换). 具体步骤: 1)定义环境角色,并初始化状态 2)通过环境角色执行行为,同时也就是对应状态的行为被执行 3)对应状态的行为的执行分为两种情况: I.对应状态对应行为执行后,环境角色继续执行行为,调用的还是此状态,此状态的下一个行为(下一状

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

一.概述 当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式.状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化.状态模式是一种对象行为型模式. 二.适用场景 用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题.简单说就是处理对象的多种状态及其相互转换. 三.UML类图 四.参与者 1>.AbstractState(抽象状态类): 在抽象状态类中定义申明了不同状态下的行为抽象方法,而由子类

设计模式 - 状态模式(state pattern) 未使用状态模式 详解

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(),