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

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
博客园 - 三生石上(FineUI控件)
博客园_首页
Jina AI
Jina AI
aimingoo的专栏
aimingoo的专栏
S
SegmentFault 最新的问题
T
Tor Project blog
云风的 BLOG
云风的 BLOG
T
Troy Hunt's Blog
K
Kaspersky official blog
T
Tenable Blog
Project Zero
Project Zero
有赞技术团队
有赞技术团队
S
Schneier on Security
P
Proofpoint News Feed
C
Check Point Blog
GbyAI
GbyAI
P
Proofpoint News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Microsoft Security Blog
Microsoft Security Blog
T
Threatpost
Know Your Adversary
Know Your Adversary
Help Net Security
Help Net Security
D
Docker
U
Unit 42
S
Securelist
月光博客
月光博客
博客园 - Franky
The Hacker News
The Hacker News
L
LangChain Blog
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
Hacker News: Ask HN
Hacker News: Ask HN
S
Security @ Cisco Blogs
AI
AI
人人都是产品经理
人人都是产品经理
The Last Watchdog
The Last Watchdog
Hacker News - Newest:
Hacker News - Newest: "LLM"
I
Intezer
The Register - Security
The Register - Security
阮一峰的网络日志
阮一峰的网络日志

博客园 - 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层就现对比较复杂。

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