设计模式:

状态模式(State Pattern)

简单介绍:

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

举例子:本例子完全参考csdn:http://blog.csdn.net/chenssy/article/details/11096391(原作者用java实现)

酒店房间状态变换图:

状态模式类图:

上图来源于菜鸟教程

角色:

状态模式包含如下角色: 
       Context: 环境类。可以包括一些内部状态。 
       State: 抽象状态类。State定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,状态之间就可以互相转换了。 
       StartStates/StopState: 具体状态类。具体状态类,用于处理来自Context的请求,每一个State的具体类都提供了它对自己请求的实现,所以,当Context改变状态时行为也会跟着改变。

酒店房间状态伪类图:

状态变迁:

然后是3个状态类,这个三个状态分别对于这:空闲、预订、入住。其中空闲可以完成预订和入住两个动作,预订可以完成入住和退订两个动作,入住可以退房。

状态模式C#代码举例

状态接口

     public interface IState
{
/// <summary>
/// 预定房间
/// </summary>
void bookRoom(); /// <summary>
/// 退订房间
/// </summary>
void UnSubscribeRoom(); /// <summary>
/// 入住
/// </summary>
void CheckInRoom(); /// <summary>
/// 退房
/// </summary>
void CheckOutRoom(); }

具体的房间类

 /*****************************************************
* ProjectName: _11DesignPattern_StatePattern
* Description:
* ClassName: Room
* CLRVersion: 4.0.30319.18444
* Author: JiYF
* NameSpace: _11DesignPattern_StatePattern
* MachineName: JIYONGFEI
* CreateTime: 2017/7/17 17:31:00
* UpdatedTime: 2017/7/17 17:31:00
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_StatePattern
{
public class Room
{
/// <summary>
/// 房间的当前状态
/// </summary>
private IState _state; public IState State
{
get { return _state; }
set { _state = value; }
}
/// <summary>
/// 房间的三个状态
/// </summary>
private IState _freeTimeState; //空闲状态 private IState _checkInState; //入住状态 private IState _bookedState; //预定状态 /// <summary>
/// 空闲状态的set和get
/// </summary>
public IState FreeTimeState
{
get { return _freeTimeState; }
set { _freeTimeState = value; }
} /// <summary>
/// 入住状态的get和set
/// </summary>
public IState CheckInState
{
get { return _checkInState; }
set { _checkInState = value; }
} /// <summary>
/// 预定状态的get和set
/// </summary>
public IState BookedState
{
get { return _bookedState; }
set { _bookedState = value; }
} public Room()
{
this._freeTimeState = new FreeTimeState(this);
this._checkInState = new CheckInState(this);
this._bookedState = new BookedState(this);
this._state = this._freeTimeState;
} /// <summary>
/// 预定房间
/// </summary>
public void bookRoom()
{
this._state.bookRoom();
} /// <summary>
/// 退订房间
/// </summary>
public void UnSubscribeRoom()
{
this._state.UnSubscribeRoom();
} /// <summary>
/// 入住
/// </summary>
public void CheckInRoom()
{
this._state.CheckInRoom();
} /// <summary>
/// 退房
/// </summary>
public void CheckOutRoom()
{
this._state.CheckOutRoom();
} public string getRoomState()
{
return "该房间的状态是:" + this.State.GetType().ToString();
} }
}

三个具体的状态是实现:

FreeTimeState.cs  房间空闲状态

 /*****************************************************
* ProjectName: _11DesignPattern_StatePattern
* Description:
* ClassName: FreeTimeState
* CLRVersion: 4.0.30319.18444
* Author: JiYF
* NameSpace: _11DesignPattern_StatePattern
* MachineName: JIYONGFEI
* CreateTime: 2017/7/17 17:34:28
* UpdatedTime: 2017/7/17 17:34:28
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_StatePattern
{
public class FreeTimeState:IState
{
private Room _hotelManagement;
public FreeTimeState()
{ } public FreeTimeState(Room hotelManagement)
{
this._hotelManagement = hotelManagement;
}
public void bookRoom()
{
//设置状态为已经预定状态
this._hotelManagement.State = this._hotelManagement.BookedState;
Console.WriteLine("您已经成功预定了...");
} public void UnSubscribeRoom()
{
//暂不操作
} public void CheckInRoom()
{
this._hotelManagement.State = this._hotelManagement.CheckInState;
Console.WriteLine("您已经成功入住...");
} public void CheckOutRoom()
{
//暂不操作
}
}
}

BookedState.cs房间预订状态

 /*****************************************************
* ProjectName: _11DesignPattern_StatePattern
* Description:
* ClassName: BookedState
* CLRVersion: 4.0.30319.18444
* Author: JiYF
* NameSpace: _11DesignPattern_StatePattern
* MachineName: JIYONGFEI
* CreateTime: 2017/7/17 17:34:45
* UpdatedTime: 2017/7/17 17:34:45
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_StatePattern
{
public class BookedState:IState
{
private Room _hotelManagement;
public BookedState()
{ } public BookedState(Room hotelManagement)
{
this._hotelManagement = hotelManagement;
}
public void bookRoom()
{
Console.WriteLine("该房间已经预定了...");
} public void UnSubscribeRoom()
{
this._hotelManagement.State = this._hotelManagement.FreeTimeState;
Console.WriteLine("退订成功,欢迎下次光临...。");
} public void CheckInRoom()
{
this._hotelManagement.State = this._hotelManagement.CheckInState;
Console.WriteLine("入住成功...");
} public void CheckOutRoom()
{
//暂不操作
}
}
}

CheckInState.cs房间入住状态

 /*****************************************************
* ProjectName: _11DesignPattern_StatePattern
* Description:
* ClassName: CheckInState
* CLRVersion: 4.0.30319.18444
* Author: JiYF
* NameSpace: _11DesignPattern_StatePattern
* MachineName: JIYONGFEI
* CreateTime: 2017/7/17 17:34:36
* UpdatedTime: 2017/7/17 17:34:36
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_StatePattern
{
public class CheckInState:IState
{
private Room _hotelManagement;
public CheckInState()
{ } public CheckInState(Room hotelManagement)
{
this._hotelManagement = hotelManagement;
}
public void bookRoom()
{
Console.WriteLine("该房间已经入住...");
} public void UnSubscribeRoom()
{
//暂不操作
} public void CheckInRoom()
{
Console.WriteLine("该房间已经入住...");
} public void CheckOutRoom()
{
this._hotelManagement.State = this._hotelManagement.FreeTimeState;
Console.WriteLine("退房成功...");
}
}
}

测试代码:

     class Test
{
static void Main(string[] args)
{
//创建俩间房子
Room[] rooms = new Room[];
//初始化
for (int i = ; i < rooms.Length; i++)
{
rooms[i] = new Room();
} //第一间房子
rooms[].bookRoom(); //预定
rooms[].CheckInRoom();//入住
rooms[].bookRoom(); //再次预定
Console.WriteLine(rooms[].State);
Console.WriteLine("---------漂亮的分割线----------"); //第二间房子
rooms[].CheckInRoom(); //入住
rooms[].bookRoom(); //预定
rooms[].CheckInRoom(); //入住
rooms[].bookRoom();//再次预定
Console.WriteLine(rooms[].State);
Console.WriteLine("---------漂亮的分割线----------"); Console.Read();
}
}

运行结果:

源代码工程文件下载

0.C#设计模式--简单工厂模式

1.C#设计模式--工厂方法模式

2.C#设计模式--抽象工厂模式

3.C#设计模式--单例模式

4.C#设计模式--建造者模式

5.C#设计模式--原型模式

6.C#设计模式--设配器模式

7.C#设计模式--装饰器模式

8.C#设计模式--代理模式

9.C#设计模式--外观模式

10.C#设计模式--桥接模式

11.C#设计模式--观察者模式(发布-订阅模式)

C#设计模式--状态模式的更多相关文章

  1. 14. 星际争霸之php设计模式--状态模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. [Head First设计模式]生活中学设计模式——状态模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  3. JAVA 设计模式 状态模式

    用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构

  4. 深入浅出设计模式——状态模式(State Pattern)

    模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...

  5. C++设计模式——状态模式

    前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...

  6. Java设计模式—状态模式

    状态模式又是一个比较难的设计模式 定义如下: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类. 个人理解:通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的 ...

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

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态, ...

  8. JavaScript设计模式——状态模式

    状态和行为: 所谓对象的状态,通常指的就是对象实例的属性的值:而行为指的就是对象的功能,再具体点说,行为大多可以对应到方法上. 状态模式的功能就是分离状态的行为,通过维护状态的变化,来调用不同状态对应 ...

  9. C#设计模式——状态模式(State Pattern)

    一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...

随机推荐

  1. poj--1088--DFS(记忆化搜索之经典)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 68057   Accepted: 25039 Description ...

  2. android:ListView bbs Demo

    我们制 作的 message_left.9.png 可以作为收到消息的背景图,那么毫无疑问你还需要再制作一张 message_right.9.png 作为发出消息的背景图. 图片都提供好了之后就可以开 ...

  3. [Sqoop]将Hive数据表导出到Mysql

    业务背景 mysql表YHD_CATEG_PRIOR的结构例如以下: -- Table "YHD_CATEG_PRIOR" DDL CREATE TABLE `YHD_CATEG_ ...

  4. [Android Pro] https://blog.csdn.net/gaugamela/article/details/79143309

    原文地址:https://blog.csdn.net/gaugamela/article/details/79143309 最近遇到这样一个问题: 第三方的SDK除了Jar包外,还提供了对应的so文件 ...

  5. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

  6. 技术分享:几种常见的JavaScript混淆和反混淆工具分析实战【转】

    信息安全常被描述成一场军备竞赛,白帽与黑帽,渗透测试者与黑客,善与恶,本文将聚焦这场永无止境决斗中的一个小点. HTML5 & JS 应用中充满着对输入进行验证/注入的问题,需要开发人员始终保 ...

  7. mipmap和drawable文件夹的区别

    在Android上创建工程,会默认创建mipmap文件夹.之前在Eclipse上创建的是drawable的文件夹.那么这两个有什么区别呢? 问题: I'm working with android s ...

  8. iOS AVAudioSession 配置(录音完声音变小问题)

    有这么一个场景,首先我们录音,录音完再播放发现音量变小了: 百思不得其解,查看API发现AVAudioSession里面有这么一个选项, 如果你的app涉及到了音视频通话以及播放其他语音,那么当遇到声 ...

  9. fork failed because of Out Of Memory

    Maybe virtual memory over commit is prevented in your system. If it is prevented, then the virtual m ...

  10. C++的子类与父类强制转换产生的问题

    近日,在项目的一个类中如果碰上想要将子类强制转换成父类,然后再调用其父类版本的virtual虚函数. 就会出现gcc编译错误提示:error: ld returned 1 exit status gc ...