定义:
状态模式的角色组成:
状态模式的 UML 类图:
情景案例:CSDN 博客平台的内容管理模块对文章进行了统一管理,目前文章的状态分为“
全部
”、“全部可见
”、“仅我可见
”、“审核
”、“草稿箱
”和“回收站
”这六种状态。不同状态文章的“行为”是不同的,例如,“全部
”表示可以看到其他五种状态文章的合集,“全部可见
”表示可以看到全部已经发表的设置设为公开的文章,“仅我可见
”表示只能看到已经发布的私密文章,使用状态模式对该情景进行模拟编码。
抽象状态类 State
:
public interface State {
void handle();
}
具体状态类 All
:
public class All implements State{
@Override
public void handle() {
System.out.println("所有文章,包括所有公开文章、私密文章、审核文章、草稿文章、已经被删除的文章");
}
}
具体状态类 AllVisible
:
public class AllVisible implements State{
@Override
public void handle() {
System.out.println("所有公开文章");
}
}
具体状态类 Private
:
public class Private implements State{
@Override
public void handle() {
System.out.println("所有私密文章");
}
}
具体状态类 Audit
:
public class Audit implements State{
@Override
public void handle() {
System.out.println("所有审核文章");
}
}
具体状态类 Manuscript
:
public class Manuscript implements State {
@Override
public void handle() {
System.out.println("所有草稿文章");
}
}
具体状态类 Recycled
:
public class Recycled implements State{
@Override
public void handle() {
System.out.println("所有已经被删除的文章");
}
}
环境类 Context
:
public class Context {
private State state;
public void setState(State state) {
this.state = state;
}
void request() {
this.state.handle();
}
}
客户端类 Client
:
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setState(new All());
context.request();
context.setState(new AllVisible());
context.request();
context.setState(new Private());
context.request();
}
}
状态模式的优点:
if...else
或 switch...case
语句,使代码更加简洁,提高了系统的可维护性。状态模式的缺点:
状态模式的适用场景:
状态模式在 JDK 或 Spring 源码中的应用:
很遗憾哈哈,目前无论是在 JDK 还是在 Spring 源码中,具体实现了状态模式的类和接口并不常见(也就是没有哈哈),因为状态模式并非是JDK 或 Spring 框架中广泛采用的设计模式之一。虽然可能没有明确称之为"状态模式",但是可以找到一些与状态模式相似的设计。例如:
ThreadPoolExecutor
类是 Java 并发库中用于执行多个线程任务的线程池实现之一。它内部维护了线程池的状态,如 RUNNING、SHUTDOWN、STOP、TIDYING 和 TERMINATED 等。根据不同的状态,ThreadPoolExecutor
会在处理任务、关闭线程池等过程中执行不同的行为,从而实现了一种状态切换的逻辑。