状态模式
基本介绍
1.主要解决对象在多种状态转换时,需要对外输出不同的行为的问题
2.状态之间可以相互转换,当一个对象的内在状态改变时,允许改变其行为,行为可能引起状态的改变
3.状态和行为是一一对应的,同一个行为,在不同状态下,有不同的实现
角色
1.Context:环境角色,维护一个 ConcreteState 对象,该对象定义了当前状态
2.State:抽象状态角色,接口 / 抽象类,封装不同状态下 Context 的相关行为
3.ConcreteState:具体状态角色,实现 State,每个子类实现在该状态下,与 Context 的相关行为
事项
1.优点
(1)强可读性,每个状态的行为封装到对应的一个类中,把转换规则封装在状态类
(2)耦合降低,每个状态只需要关心自己内部的实现,而不会影响到其他的状态,
(3)方便维护,容易增删状态,将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
(4)可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
2.缺点
(1)类膨胀:每个状态都要一个对应的类,当状态过多时会产生很多类,加大维护难度
(2)增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码
3.应用场景
(1)当一个事件或者对象有很多种状态,状态之间会相互转换,对不同的状态要求有不同的行为时
(2)条件、分支语句(if else)的代替者。
策略模式、状态模式
1.策略模式:控制对象使用什么策略,策略是手动转换的
2.状态模式:状态模式会自动改变状态,在相关的状态类方法里面封装转换的过程,状态的改变是在状态内部发生的,在执行动作时进行自动的转换
代码示例
public class Client {//客户端
public static void main(String[] args) {
Context context = new Context();
ConcreteState1 concreteState1 = new ConcreteState1();
ConcreteState2 concreteState2 = new ConcreteState2();
concreteState1.action(context);
concreteState2.action(context);
}
}
class Context {//环境
private State state;
public ConcreteState1 concreteState1 = new ConcreteState1();
public ConcreteState2 concreteState2 = new ConcreteState2();
public Context() {
this.state = concreteState1;
}
public void setState(State state) {
this.state = state;
}
}
interface State {//抽象状态
void action(Context context);
}
class ConcreteState1 implements State {//具体状态1
@Override
public void action(Context context) {
System.out.println("Context处于状态 1 执行行为");
System.out.println("Context从状态 1 转换为状态 2");
context.setState(context.concreteState2);
}
}
class ConcreteState2 implements State {//具体状态2
@Override
public void action(Context context) {
System.out.println("Context处于状态 2 执行行为");
System.out.println("Context从状态 2 转换为状态 1");
context.setState(context.concreteState1);
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战