Android设计模式之状态模式

作为一枚苦逼的程序猿,在平时的开发任务中往往会遇到这样的情形,同一个方法在不同的情况下要进行不同的操作,如打电话的方法,在正常情况下是打电话,但是在飞行模式下就是不能使用的,如同样是空调的调节温度的方法在没有开电源的情形下也是不能使用的吧,等等诸如此类的问题,我们当然想到了在每次操作的时候进行先决条件的判断,下面以空调为例,我们来看如下代码:

package com.demo.admin;

public class AirConditionController {
private int state = 2;
public static final int STATE_ON = 1;
public static final int STATE_OFF = 2;

public void turnOn() {
if (state == STATE_OFF) {
System.out.println("打开了空调");
state = STATE_ON;
}
}

public void turnOff() {
if (state == STATE_ON) {
System.out.println("关闭了空调");
state = STATE_OFF;
}
}

public void upTempure() {
if (state == STATE_ON) {
System.out.println("调高了温度");
}else{
System.out.println("空调关闭,无法调节温度");
}
}

public void downTempure() {
if (state == STATE_ON) {
System.out.println("降低了温度");
}else{
System.out.println("空调关闭,无法调节温度");
}
}

public void changeModel() {
if (state == STATE_ON) {
System.out.println("调节了模式");
}else{
System.out.println("空调关闭,无法调节模式");
}
}
}

在每个方法操作的时候进行状态判断,同时在开关的时候进行状态的切换就可以了。

测试代码如下:

package com.demo.admin;

public class Test {

public static void main(String[] args) {
AirConditionController controller = new AirConditionController();
controller.downTempure();
controller.turnOn();
controller.upTempure();
controller.turnOff();
controller.changeModel();
}
}

打印出的日志如下:


当然是没有任何问题的,但是大家有没有想过,如果在上述的问题中state的状态非常多,不只是开和关呢,我们又应该如何处理这个问题呢,不停地if...else,还是不停地switch...case,貌似哪种都不太合适,容易显得代码臃肿,不利于后期的维护。

是不是很苦恼呢?


苦恼的时候看看美女(开玩笑),还没想到???  请看标题,状态模式

下面我们开始动手改代码:

先看看目录视图:


其中的AirConditionController 仍然是控制类,

IAirConditionController  抽象出的控制类接口,包含开和关两个方法

其实就是在进行状态机的状态设。

IAirConditionState抽象出的状态类,抽象出需要在不同状态下进行不同操作的方法。

OffAirConditionState  关闭状态的具体实现。

OnAirConditionState  开启状态的具体实现。

这样就好办多了,如下

IAirConditionState  抽象类需要有如下三个方法:

调高温度,降低温度,调节模式。

如下:

package model;
/**
 * 状态控制接口,
 * 提取需要分状态操作的方法
 * @author Administrator
 *
 */
public interface IAirConditionState {
public void upTempure();
public void downTempure();
public void changeModel();
}

开和关的实现分别如下:

package model;
public class OnAirConditionState implements IAirConditionState {

@Override
public void upTempure() {

System.out.println("调高了温度");
}

@Override
public void downTempure() {
System.out.println("降低了温度");
}

@Override
public void changeModel() {
System.out.println("调节了模式");
}

}

//关闭的实现状态类

package model;
public class OffAirConditionState implements IAirConditionState{

@Override
public void upTempure() {
System.out.println("空调关闭,无法调节温度");
}

@Override
public void downTempure() {
System.out.println("空调关闭,无法调节温度");
}

@Override
public void changeModel() {
System.out.println("空调关闭,无法调节模式");
}

}

IAirConditionController  抽象出开和关的方法:

如下:

package model;
/**
 * 状态控制接口,
 * 提取需要分状态操作的方法
 * @author Administrator
 *
 */
public interface IAirConditionState {
public void upTempure();
public void downTempure();
public void changeModel();
}  


最终实现类如下:

package model;

public class AirConditionController implements IAirConditionController {

private IAirConditionState mIAirConditionState;
public void setmIAirConditionState(IAirConditionState mIAirConditionState) {
this.mIAirConditionState = mIAirConditionState;
}

@Override
public void turnOn() {
setmIAirConditionState(new OnAirConditionState());
}

@Override
public void turnOff() {
setmIAirConditionState(new OffAirConditionState());
}

public void upTempure() {
mIAirConditionState.upTempure();
}

public void downTempure() {
mIAirConditionState.downTempure();
}

public void changeModel() {
mIAirConditionState.changeModel();
}
}

其中关方法进行状态机状态的切换,其余的方法只需要调用状态接口的方法实现即可,具体得操作由传入的子状态类决定。

上面的问题:

如果状态很多呢? 怎么做。

只需要增加各个状态类取实现状态接口实现具体得操作就可以了。

设置状态的时候设置相应的状态就可以了。

是不是很方便呢,各位小伙伴。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值