状态模式(State Pattern)

意图

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。

动机

在软件开发过程中,应用程序中的有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态会发生改变,从而使得其行为也随之发生改变。

适用性

通常在以下情况下可以考虑使用状态模式:

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
  • 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。

结构

状态模式模式的主要角色有:

  • 抽象状态类(Status)、具体状态类(ConcreteStatus)、环境类(Context

实现

// 抽象状态类
public interface Status {
	void handle();
}

//具体状态类A
public class ConcreteStratusA implements Status {

	@Override
	public void handle() {
		 System.out.println("执行 ConcreteStratusA 的处理状态方法。。。");
	}
}

public class ConcreteStratusB implements Status {

	@Override
	public void handle() {
		 System.out.println("执行 ConcreteStratusB 的处理状态方法。。。");
	}
}

// 环境类
public class Context {

	private Status status;

	public void setStatus(Status status) {
		this.status = status;
	}

	// 通过 set 不同的 status 对象,而动态地改变他的行为
	public void operation() {
		status.handle();
	}

}

// 测试客户端
public class TestClient {

	public static void main(String[] args) {
		Context context = new Context();
		Status concreteA = new ConcreteStratusA();
		Status concreteB = new ConcreteStratusB();
		context.setStatus(concreteA);
		context.operation();
		context.setStatus(concreteB);
		context.operation();
	}
}

已知应用

相关模式

状态模式与策略模式:
1、状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。
2、两者的意图不同: 状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。
3、状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。

状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变。

参考资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值