状态模式
定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.
使用场景:
- 一个对象的行为取决于它的状态,而且他必须在运行时根据状态改变它的行为.
- 代码中包含大量与对象状态有关的条件语句.
举个电视剧的例子:
第一版代码:
//电视遥控器,含有 开机,关机,下一个频道,上一个频道,调高音量,调低音量
public class TVController {
//开机状态
private final static int POWER_ON = 1;
//关机状态
private final static int POWER_OFF = 2;
private int state = POWER_OFF;
public void powerOn(){
if (state == POWER_OFF){
System.out.println("开机啦");
}
state = POWER_ON;
}
public void powerOff(){
if (state ==POWER_ON){
System.out.println("关机啦");
}
state = POWER_OFF;
}
public void nextChannel(){
if (state == POWER_ON){
System.out.println("下一个频道");
}else {
System.out.println("两个红灯提示没有开机");
}
}
public void prevChannel(){
if (state == POWER_ON){
System.out.println("上一个频道");
}else {
System.out.println("两个红灯提示没有开机");
}
}
public void turnUp(){
if (state == POWER_ON){
System.out.println("调高音量");
}else {
System.out.println("两个红灯提示没有开机");
}
}
public void turnDown(){
if (state == POWER_ON){
System.out.println("调低音量");
}else {
System.out.println("两个红灯提示没有开机");
}
}
}
这样就有很多重复代码,相对较为混乱. 下面就使用状态模式 简单处理一下.
//定义电视操作的函数
public interface TvState {
public void nextChannel();
public void prevChannel();
public void turnUp();
public void turnDown();
}
public class PowerOffStatus implements TvState{
@Override
public void nextChannel() {
}
@Override
public void prevChannel() {
}
@Override
public void turnUp() {
}
@Override
public void turnDown() {
}
}
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 interface PowerController {
public void powerOn();
public void powerOff();
}
public class TvControll implements PowerController{
TvState tvState;
public void setTvState(TvState tvState) {
this.tvState = tvState;
}
@Override
public void powerOn() {
setTvState(new PowerOnState());
System.out.println("开机啦");
}
@Override
public void powerOff() {
setTvState(new PowerOffStatus());
System.out.println("关机啦");
}
public void nextChannel(){
tvState.nextChannel();
}
public void prevChannel(){
tvState.prevChannel();
}
public void turnUp(){
tvState.turnUp();
}
public void turnDown(){
tvState.turnDown();
}
}
Client 使用
public static void main(String[] args) {
TvControll tvControll = new TvControll();
//设置开机状态
tvControll.powerOn();
//下一个频道
tvControll.nextChannel();
//调高音量
tvControll.turnUp();
//关机状态
tvControll.powerOff();
//调低音量
tvControll.turnDown();
}
打印出来的:
开机啦
下一个频道
声音跳大
关机啦
关机后没有办法调低音量的. 这个虽然代码,类多了,但是逻辑很清晰明了.
网友评论