个人博客
http://www.milovetingting.cn
状态模式
模式介绍
状态模式中的行为是由状态来决定的,不同状态下有不同的行为。
模式定义
当一个对象的内在状态改变时允许其改变行为。
使用场景
一个对象的行为取决于它的状态,并且它必须在运行时根据状态来改变行为。
 
代码中包含大量与对象状态有关的条件语句。
 
简单使用
定义状态接口
1 2 3 4 5 6
   | public interface TvState { 	public void nextChannel(); 	public void prevChannel(); 	public void turnUp(); 	public void turnDown(); }
  | 
 
定义实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   | public class PowerOnState implements TvState {
  	@Override 	public void nextChannel() { 		System.out.println("下一个频道"); 	}
  	@Override 	public void prevChannel() { 		System.out.println("上一个频道"); 	}
  	@Override 	public void turnUp() { 		System.out.println("增加音量"); 	}
  	@Override 	public void turnDown() { 		System.out.println("减小音量"); 	}
  }
  public class PowerOffState implements TvState{
  	@Override 	public void nextChannel() { 		 	}
  	@Override 	public void prevChannel() { 		 	}
  	@Override 	public void turnUp() { 		 	}
  	@Override 	public void turnDown() { 		 	}
  }
  | 
 
定义控制类接口
1 2 3 4
   | public interface PowerController { 	public void powerOn(); 	public void powerOff(); }
  | 
 
定义控制类的实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | public class TvController implements PowerController {
  	private TvState mTvState;
  	private void setTvState(TvState tvState) { 		mTvState = tvState; 	}
  	@Override 	public void powerOn() { 		setTvState(new PowerOnState()); 		System.out.println("开机啦"); 	}
  	@Override 	public void powerOff() { 		setTvState(new PowerOffState()); 		System.out.println("关机啦"); 	}
  	public void nextChannel() { 		mTvState.nextChannel(); 	}
  	public void prevChannel() { 		mTvState.prevChannel(); 	}
  	public void turnUp() { 		mTvState.turnUp(); 	}
  	public void turnDown() { 		mTvState.turnDown(); 	}
  }
  | 
 
调用
1 2 3 4 5 6 7 8
   | public static void main(String[] args) { 		TvController tvController = new TvController(); 		tvController.powerOn(); 		tvController.nextChannel(); 		tvController.turnUp(); 		tvController.powerOff(); 		tvController.turnDown(); 	}
  | 
 
输出结果