状态模式

本文深入解析状态模式的概念、角色及优缺点,并通过代码示例展示如何在实际编程中应用状态模式来简化对象行为的管理。文章还对比了状态模式与策略模式的异同,帮助开发者更好地理解模式之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态模式

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

角色
  1. context应用环境:内部持有多个state的引用以及代表当前状态的应用
  2. state状态接口:定义了所有具体状态的共同接口,任何状态都要实现这个接口,以便,状态之间相互替代。
  3. concreteState具体状态:处理来自context的请求,每个concreteState都提供了自己对于请求的实现,所有,当context改变状态是,行为也会跟着改变。
优点
  1. 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来
  2. 它使得状态转换显式化
  3. State对象可被共享
缺点:
  1. 状态模式的使用必然会增加系统类和对象的个数。
  2. 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
应用场景
  1. 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
  2. 代码中包含大量与对象状态有关的条件语句
状态模式与策略模式
  1. 两者类图相同。
  2. 两者意图不同。
    状态模式中,context的行为可以委托到所有状态中的任意一个,一般地,当前状态会自发地再各个状态之间游走(比如:饿,吃饭,到饱),不必context去特意指定。而且,context内会包含多个state的引用。在策略模式中,context通常为了实现某一种算法、策略,会自动指定特定的策略对象。一般,context只包含一个策略对象的引用。
  3. 一般来说,我们把策略模式想成是除里继承之外的一种弹性替代方案。而把状态模式想成是不用再context中放置许多判断条件的替代方案。
代码示例
/**
 * 猪的状态接口
 * 
 * @author sky
 * 
 */
public interface PigState {

	public void eat();

	public void sleep();

}

/**
 * 猪饿的状态
 * 
 * @author sky
 * 
 */
public class HungerState implements PigState {

	private Pig pig;

	public HungerState(Pig pig) {
		this.pig = pig;
	}

	@Override
	public void eat() {
		System.out.println("猪饿了,吃食。。。。。变饱了。");
		pig.setNowState(pig.getFull());
	}

	@Override
	public void sleep() {
		System.out.println("猪饿了,睡不着。");
	}

}

/**
 * 猪饱的状态
 * 
 * @author sky
 * 
 */
public class FullState implements PigState {

	private Pig pig;

	public FullState(Pig pig) {
		this.pig = pig;
	}

	@Override
	public void eat() {
		System.out.println("猪很饱,吃不下。");
	}

	@Override
	public void sleep() {
		System.out.println("猪睡了一觉。。。。又饿了。");
		pig.setNowState(pig.getHunger());
	}

}


/**
 * 猪
 * 
 * @author sky
 * 
 */
public class Pig {

	private PigState hunger;

	private PigState full;

	private PigState nowState;

	public Pig() {
		hunger = new HungerState(this);
		full = new FullState(this);
		nowState = hunger;
	}

	public PigState getNowState() {
		return nowState;
	}

	public void setNowState(PigState nowState) {
		this.nowState = nowState;
	}

	public void eat() {
		nowState.eat();
	}

	public void sleep() {
		nowState.sleep();
	}

	public PigState getHunger() {
		return hunger;
	}

	public PigState getFull() {
		return full;
	}
}

/**
 * 测试类
 * 
 * @author sky
 * 
 */
public class Test {


	public static void main(String[] args) {
		Pig pig = new Pig();
		pig.sleep();
		pig.eat();
		pig.eat();
		pig.sleep();

	}
}

输出:
	猪饿了,睡不着。
	猪饿了,吃食。。。。。变饱了。
	猪很饱,吃不下。
	猪睡了一觉。。。。又饿了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值