移动架构-状态模式

当一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。又称状态对象模式,状态模式是对象的行为模式

角色

环境(Context)角色:上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个定义了对象的当前状态
抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为
具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为

使用场景

  1. 一个对象的行为取决于他的状态,并且他必须在运行时根据状态改变他的行为
  2. 代码中包含大量与对象相关的条件语句,例如一个操作中含有多分支语句。这些分支历来与该对象
  3. 状态模式将每一个条件分支放入一个独立类中,这使得你可以根据对象自身的情况将状态作为一个对象。这一对象可以不依赖于其他对象而独立变化。这样通过过多的,重复的if-else分支语句

理解实例

首先有一个环境角色

public interface TvState {
	public void nextChannel();
	public void preChannel();
	public void turnOn();
	public void turnOff();
}

抽象状态角色

public class PowerOffState implements TvState{

	@Override
	public void nextChannel() {
		System.out.println("下一个频道,无效");
	}

	@Override
	public void preChannel() {
		System.out.println("上一个频道,无效");
	}

	@Override
	public void turnOn() {
		System.out.println("开机,有效");
	}

	@Override
	public void turnOff() {
		System.out.println("关机,无效");
	}
}
public class PowerOnState implements TvState{

	@Override
	public void nextChannel() {
		System.out.println("下一个频道,有效");
	}

	@Override
	public void preChannel() {
		System.out.println("上一个频道,有效");
	}

	@Override
	public void turnOn() {
		System.out.println("开机,无效");
	}

	@Override
	public void turnOff() {
		System.out.println("关机,有效");
	}
}

具体状态角色

public class TvControl {
	
	TvState tvState;
	
	public void setState(TvState tvState) {
		this.tvState = tvState;
	}
	
	public void powerOn() {
		setState(new PowerOnState());
		System.out.println("开机");
	}
	
	public void powerOff() {
		setState(new PowerOffState());
		System.out.println("关机");
	}
	
	public void nextChannel() {
		tvState.nextChannel();
	}

	public void preChannel() {
		tvState.preChannel();
	}

	public void turnOn() {
		tvState.turnOn();
	}

	public void turnOff() {
		tvState.turnOff();
	}
}
posted @ 2019-04-06 21:26  cj5785  阅读(178)  评论(0编辑  收藏  举报