状态模式

状态模式(state pattern):当一个对象内在状态改变时允许其改变行为,这个对象看起来像是改变了其类(也可以理解为把众多的if-else进行优化,将不同条件下的行为封装到一个类里,再给这些类一个父类来约束它们)。

类图及角色在这里插入图片描述

环境(context)角色:定义客户程序需要的接口,客户程序通过它满足自己的需求。维护一个具体状态角色的实例,这个实例来决定当前的状态。
抽象状态角色(state):定义一个接口来封装与环境角色一个特定状态相关的行为。
具体状态(concrete state)角色:实现状态角色定义的接口。结构非常简单。

通过多态,可以动态地改变语境(context)对象的属性state的内容,从而使一个具体状态类指向另一个具体状态类,从而改变语境(context)对象的行为。

状态模式的优点

1、封装转化过程,也就是转化规则。
2、枚举可能的状态。

状态模式的实质:

  1. 使用状态模式前,客户端外界需要介入改变状态,客户端不用关注细节。
  2. 每个状态形成一个子类,只关心它的下一个可能状态,从而无形中形成了转化规则。
  3. 如果新状态的加入,只涉及它的前一个状态的修改和定义。
  4. 每个状态可以实现next()方法,指定下一个状态。或者设定状态的进入和退出行为。
状态模式的使用情况
  1. 类似开关的状态切换是很常见的存在,不只根据状态,也有根据属性。实际使用中也不用非要使用state模式,这样会产生很多子类,使简单的变复杂,关键取决于你的经验和对系统的理解深度,。
  2. 银行账户(状态的切换)、经典的TcpConnection(创建、侦听、关闭)、工具箱中挑选不同的工具。
  3. 状态模式允许客户端改变状态,状态机是自动改变状态,状态模式在工作流或者游戏系统中有大量使用,甚至是核心设计,状态模式是可以对整个游戏的架构起到核心作用。
//抽象状态角色
public abstract class State {
	public abstract void handle(Context context);
}
//Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
public class Context {
	private State state;
	
    public Context(State state) {
    	this.state = state;
    }
    public State getState() {
    	return state;
    }
    public void setState(State state) {
    	this.state = state;
    }
    public void request() {
    	this.state.handle(this);
    }
}
//具体状态
class ConcreteStateA extends State {
    @Override
    public void handle(Context context) {
		System.out.println("现在是在状态A");
		context.setState(new ConcreteStateB());
    }
}
class ConcreteStateB extends State {
    @Override
    public void handle(Context context) {
		System.out.println("现在是在状态B");
		context.setState(new ConcreteStateC());
    }
}
class ConcreteStateC extends State {
    @Override
    public void handle(Context context) {
		System.out.println("现在是在状态C");
		context.setState(new ConcreteStateA());
    }
}
//客户端,不断地发请求
public class Client {
	public static void main(String[] args) {
		Context context = new Context(new ConcreteStateA());
		context.request();
		context.request();
		context.request();
		context.request();
		context.request();
	}
}

上一篇: 模板方法模式
下一篇: 策略模式

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值