设计模式-状态模式

状态模式:当一个对象 的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

简单点说:一个对象的功能根据它内部状态而表现出不同的行为。

举一个反例,用遥控器来举例,遥控器在电视开的情况下和电视没开的情况下,同样的按键会表现出不同的结果。

普通的编程方式:

public class TeleController {

	/**
	 * 开机状态
	 */
	public static int STATE_ON = 1;
	
	/**
	 * 关机状态
	 */
	public static int STATE_OFF = 2;
	
	/**
	 * 当前状态
	 */
	private int currentState;
	
	/**
	 * 按电源键
	 */
	public void powerOn(){
		if(currentState == STATE_ON){
			currentState = STATE_OFF;
			System.out.println("电视关啦..");
		}else{
			currentState = STATE_ON;
			System.out.println("电视开啦..");
		}
	}
	
	public void powerOff(){
		if(currentState == STATE_ON){
			currentState = STATE_OFF;
			System.out.println("电视关了..");
		}
	}
	
	/**
	 * 下一个频道
	 */
	public void next(){
		if(currentState == STATE_ON){
			System.out.println("切换到下一个频道了..");
		}
	}
	
	/**
	 * 上一个频道
	 */
	public void pre(){
		if(currentState == STATE_ON){
			System.out.println("切换到上一个频道...");
		}
	}
	
	/**
	 * 调大音量
	 */
	public void turnOn(){
		if(currentState == STATE_ON){
			System.out.println("调大音量...");
		}
	}
	
	public void turnOff(){
		if(currentState == STATE_ON){
			System.out.println("调小音量..");
		}
	}
}

看着也不错,但是代码明显已经有重复的了,比如判断状态,有人可能会说,把判断状态提成一个方法吧,这样代码既复用,又好看,但是这不能从根本上解决问题,因为根本上还是要去做判断,而这只是两种状态,如果以后加入10种状态,10个功能方法呢????你的if,else判断怎么办?╮(╯▽╰)╭根本是判断不完的好不好。。

这个时候我就需要用状态模式来解决这个问题了,因为这四个方法是根据状态的不同而表现出的不同结果,所以其实我们只需要改变状态就行,而不需要去改变这四个方法,那到底怎么做,看着。

定义顶层接口,抽象与状态相关的方法:

/**
 * 与状态相关的方法抽象
 * @author PC
 *
 */
public interface State {

	/**
	 * 下一个频道
	 */
	public void next();
	
	/**
	 * 上一个频道
	 */
	public void pre();
	
	/**
	 * 调大音量
	 */
	public void turnOn();
	
	/**
	 * 调小音量
	 */
	public void turnOff();
	
}

实现类:

开机状态:

/**
 * 开机状态
 * @author PC
 *
 */
public class PowerOnState implements State {

	public void next() {
		System.out.println("切换到下一频道..");
	}

	public void pre() {
		System.out.println("切换到上一频道..");
	}

	public void turnOn() {
		System.out.println("调大声音..");
	}

	public void turnOff() {
		System.out.println("调小声音..");
	}

}
关机状态:

/**
 * 关机状态
 * @author PC
 *
 */
public class PowerOffState implements State {

	public void next() {
	}

	public void pre() {
	}

	public void turnOn() {
	}

	public void turnOff() {
	}

}

遥控器类:

public class TeleController {

	/**
	 * 状态
	 */
	private State state;
	
	/**
	 * 开机状态
	 */
	private State stateOn = new PowerOnState();
	
	/**
	 * 关机装填
	 */
	private State stateOff = new PowerOffState();
	
	public void setState(State state){
		this.state = state;
	}
	
	/**
	 * 按电源键
	 */
	public void powerOn(){
		setState(stateOn);
		System.out.println("电视开了..");
	}
	
	public void powerOff(){
		setState(stateOff);
		System.out.println("电视关了..");
	}
	
	/**
	 * 下一个频道
	 */
	public void next(){
		state.next();
	}
	
	/**
	 * 上一个频道
	 */
	public void pre(){
		state.pre();
	}
	
	/**
	 * 调大音量
	 */
	public void turnOn(){
		state.turnOn();
	}
	
	/**
	 * 调小音量
	 */
	public void turnOff(){
		state.turnOff();
	}
}

看到没,只关心状态的切换,具体的功能让具体的状态实现类去完成,而且切换状态也不需要判断,代码清晰,扩展或者修改几乎不影响这个功能类。

在powerOn状态中四个功能都有反应,在powerOff状态中四个功能都没有反应,呵呵哈哈哈。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值