惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Google DeepMind News
Google DeepMind News
博客园 - 【当耐特】
量子位
博客园 - 司徒正美
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
Jina AI
Jina AI
J
Java Code Geeks
腾讯CDC
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
I
InfoQ
D
Docker
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
宝玉的分享
宝玉的分享
G
Google Developers Blog
GbyAI
GbyAI
Y
Y Combinator Blog
有赞技术团队
有赞技术团队
H
Help Net Security

博客园 - 宝气狗

【摄影】2008年06月07日西塘 【摄影】2008年05月24日大明山 2007年11月——感受黄山,天下无山。 将基础数据类型与字节数组相互转换 托管/非托管类型对照 【数据库】遍历XML根下的一级节点 - 宝气狗 - 博客园 Enterprise Library中缓存过期策略探究 css中的nowrap 2007年9月15日 九溪-五云山-梅家坞之行 宝气狗的新闻博开始使用http://webbased.cn [设计模式] 15.Command 命令模式 [设计模式] 23.Strategy 策略模式 值类型装箱拆箱需要注意的地方 CLR如何控制类型中字段的布局 MSIL指令速查 内存一致性问题(续一) 内存一致性问题 如何循序渐进向DotNet架构师发展 关于将Queue中的数据拼接成xml的经验
[设计模式] 22.State 状态模式
宝气狗 · 2007-08-13 · via 博客园 - 宝气狗

我的理解:状态模式类似于策略模式([设计模式] 23.Strategy 策略模式),将状态的变化抽象出来(状态的抽象类)。
不同的状态继承这个状态抽象类。并实现该状态下方法的变动。
与策略模式不同的是,抽象类中一般还维护着各状态的变动。下面举例:

public class Elevator
{
 ElevatorState _elevatorState;
 
public Elevator()
 
{
  _elevatorState 
= new ElevatorStop();//默认为停止状态
 }

 
public void Run()
 
{
  _elevatorState.Display();
  _elevatorState 
= _elevatorState.NextState;
 }

}


//电梯的状态抽象

public abstract class ElevatorState
{
 
protected abstract void Display();//电梯展示灯在各状态中要显示的内容
 protected abstract ElevatorState NextState{get;}//电梯在这个状态后应该转变为什么状态
}

//电梯运行状态

public class ElevatorRun : ElevatorState
{
 
public override void Display()
 
{
  Console.WriteLine(
"电梯运行中");
 }

 
public override ElevatorState NextState
 
{
  
get return new ElevatorStop(); }
 }

}

//电梯停止状态

public class ElevatorStop : ElevatorState
{
 
public override void Display()
 
{
  Console.WriteLine(
"电梯已停止.");
 }

 
public override ElevatorState NextState
 
{
  
get return new ElevatorRun(); }
 }

}