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

推荐订阅源

B
Blog
The Cloudflare Blog
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
L
LangChain Blog
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
I
InfoQ
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
H
Help Net Security
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - BigRain

小学生学习汉字,汉字抓取 c# regex regextools cache 访问频率的思考 python 百度cpc点击 20130118SQL记录 PPT辅助工具 检查外链的方法 webService启用cookie的另一种方法 百度调价HttpWebRequest 装饰者模式 第一个android程序闪亮登场 SQL 的一些批量插入和修改 职责链模式的运用 程序人生 SerialPort实现modem的来电显示 利用枚举进行状态的设计 singleton模式 在软件开发中的运用 我对当前项目的一些看法 闲话闲说——关于异常
State Pattern
BigRain · 2009-05-20 · via 博客园 - BigRain

状态机模式,在设计模式中算是比较简单和容易理解的一个了。

最近在项目中运用了这个模式,是C#的实现。晚上用java实现了一下。
首先建一个Context
public class Context {
public Context(){
  State s=new AState(this);
  this.SetState(s);
}
public Context(State state){
}
private State currentState=null;
public State GetState() {
  return this.currentState;
}
public void SetState(State value){
  this.currentState=value;
}
}
然后建一个State抽象类
public abstract class State {
protected Context currentContext;
public abstract void TurnNext();
public abstract void Print();
}
为了测试,分别建立两个State的子类AState 和 BState
状态机为在A和B之间相互转化
public class AState extends State {
public AState(Context context){
  this.currentContext=context;
}
public void TurnNext(){
  this.currentContext.SetState(new BState(this.currentContext));
}
public void Print(){
  System.out.println("Current State is A");
}
}
public class BState extends State {
public BState(Context context){
  this.currentContext=context;
}
public void TurnNext(){
  this.currentContext.SetState(new AState(this.currentContext));
}
public void Print(){
  System.out.println("Current State is B");
}
}
最后是Client的调用了
public class Client {
public static void main(String[] args){
  Context c=new Context();
  c.GetState().Print();
  c.GetState().TurnNext();
  c.GetState().Print();
  c.GetState().TurnNext();
  c.GetState().Print();
}
}
输出结果:
Current State is A
Current State is B
Current State is A
(和预计的一样)
这个就是State Pattern 很容易吧。
这么久没有写java代码了,才发现写起来这么的生疏。现在几乎都是在写C#代码了,看来还是要多抽空写写java代码才行。OO的感觉真好。

意图:
 允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。  ------《设计模式》GOF

个人觉得使用的场景:

简单的状态不适合使用。如果只是几个简单的可确定的状态,完全可以使用if-else来处理。

复杂的状态适合使用。State模式用于处理相对复杂的状态转换,将复杂分解到各个子状态中。怎么样才算复杂呢?我觉得if-else嵌套超过了3层就现对比较复杂。

需求的不确定性。比如以后可能新增一些状态,使用模式后就会是程序改动起来相对容易和简单。