Android设计模式之状态模式
2017-10-17 13:00
387 查看
前言
状态模式和策略模式结构几乎完全一样,但是他们的本质却完全不同。状态模式中的行为是平行的,不可替换的;策略模式的行为是完全独立,可以相互替换。状态模式的理解
1. 状态模式中的行为由其状态来决定,不同的状态下有不同的行为。2. 状态模式把对象的行为包装在不同的状态对象里,每一个状态对象都有一个共同的抽象状态基类。
3. 状态的模式的意图是让一个对象在其内部状态改变的时候,其行为也随之发生改变。
状态模式的使用场景
一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变自身的行为。代码中含有大量的与状态有关的条件语句(if-else或switch-case),且这些分支依赖于该对象状态的改变。
状态模式的UML类图
Context: 环境类,定义客户感兴趣的接口或方法。维护了一个State类型的子类的实例,这个实例对应了对象当前的状态。State: 抽象状态类或状态接口。定义一个或者一组接口,表示状态对应的行为。
ConcreteStateA、ConcreteStateB: 具体状态类,实现State从而达到不同的状态对应不同的行为。
状态模式的简单示例
以手机飞行模式为例,当飞行模式关闭时,我们的手机可以正常打电话、发短信、上网,当我们打开飞行模式时,打电话、发短信、上网就会受到限制不可用,也就是飞行模式状态的改变决定了手机的行为。普通实现:
public class PhoneController { private static final int FLIGHT_MODE_ON = 1; //飞行模式开启 private static final int FLIGHT_MODE_OFF = 2; //飞行模式关闭 private int mState = FLIGHT_MODE_OFF; //默认飞行模式关闭 public void openFlightMode() { if (mState == FLIGHT_MODE_OFF) { mState = FLIGHT_MODE_ON; System.out.println("飞行模式开启"); } } public void closeFlightMode() { if (mState == FLIGHT_MODE_ON) { mState = FLIGHT_MODE_OFF; System.out.println("飞行模式关闭"); } } public void call() { if (mState == FLIGHT_MODE_OFF) { System.out.println("拨号正常"); } else { System.out.println("拨号受限,请先关闭飞行模式"); } } public void sendMessage() { if (mState == FLIGHT_MODE_OFF) { System.out.println("短信发送正常"); } else { System.out.println("短信发送受限,请先关闭飞行模式"); } } public void goInternet() { if (mState == FLIGHT_MODE_OFF) { System.out.println("上网正常"); } else { System.out.println("上网受限,请先关闭飞行模式"); } } }
在PhoneController类中用mSate存储了手机当前的飞行模式状态,并且在执行各个函数时根据状态得到不同的结果。这就导致了每个函数中都需要使用if-else,代码重复、相对较为混乱。以上实例还只有两个状态和少数功能,假如有很多个状态,很多个功能呢,每个函数都需要使用if-else进行判断,大量重复的代码充斥在一个类,就会导致这个类越来越难维护。
状态模式就是为解决这类问题而设计的,我们可以将这些状态用对象来代替,将这些行为封装到对象中,使得在不同的状态对象中有不同的行为实现。这样就可以把if-else从PhoneController类中去掉,代码结构变得清晰易维护。
状态模式实现:
/** * 手机状态接口,定义了手机操作的函数 */ public interface PhoneState { public void call(); public void sendMessage(); public void goInternet(); }
/** * 飞行模式关闭状态 */ public class FlightModeOffState implements PhoneState { @Override public void call() { System.out.println("拨号正常"); } @Override public void sendMessage() { System.out.println("短信发送正常"); } @Override public void goInternet() { System.out.println("上网正常"); } }
/** * 飞行模式开启状态 */ public class FlightModeOnState implements PhoneState { @Override public void call() { System.out.println("拨号受限,请先关闭飞行模式"); } @Override public void sendMessage() { System.out.println("短信发送受限,请先关闭飞行模式"); } @Override public void goInternet() { System.out.println("上网受限,请先关闭飞行模式"); } }
/** * 飞行模式开关接口 */ public interface FlightModeController { public void openFlightMode(); public void closeFlightMode(); }
/** * 飞行模式控制器 */ public class PhoneController implements FlightModeController, PhoneState { private PhoneState mPhoneState; //设置飞行模式状态 public void setPhoneState(PhoneState phoneState) { mPhoneState = phoneState; } //开启飞行模式 @Override public void openFlightMode() { setPhoneState(new FlightModeOnState()); } //关闭飞行模式 @Override public void closeFlightMode() { setPhoneState(new FlightModeOffState()); } //打电话 @Override public void call() { mPhoneState.call(); } //发短信 @Override public void sendMessage() { mPhoneState.sendMessage(); } //上网 @Override public void goInternet() { mPhoneState.goInternet(); } }
/** * 客户端调用 */ public class Client { public static void main(String[] args) { PhoneController phoneController = new PhoneController(); //关闭飞行模式 phoneController.closeFlightMode(); phoneController.call(); phoneController.sendMessage(); phoneController.goInternet(); //开启飞行模式 phoneController.openFlightMode(); phoneController.call(); phoneController.sendMessage(); phoneController.goInternet(); } }
输出结果如下:
拨号正常 短信发送正常 上网正常 拨号受限,请先关闭飞行模式 短信发送受限,请先关闭飞行模式 上网受限,请先关闭飞行模式
上述实现中,我们抽象出了一PhoneState接口,里面定义了多个功能操作,飞行模式开启状态(FlightModeOnState)和飞行模式关闭状态(FlightModeOffState)分别实现了PhoneState接口,当我们在PhoneController类中操作不同功能时,会转发给状态对象(FlightModeOnState、FlightModeOffState)进行具体操作,根据状态不同得到不同的行为。这样就通过多态的形式除去了重复、杂乱的if-else语句,这就是状态模式的精髓所在。
总结
状态模式的优点:State模式将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,是繁琐的状态判断转化成清晰的状态类族,在避免代码膨胀的同时也保证了可扩展性和可维护性。
状态模式的缺点:
状态模式的使用必然会增加系统类和对象的个数。
相关文章推荐
- Android与设计模式——状态(State)模式
- Android设计模式(十三)--状态模式
- android设计模式之状态模式
- Java/Android 设计模式系列(19)--状态模式
- android设计模式之---状态模式
- Android 设计模式实战笔记 状态模式
- Android设计模式之——状态模式
- Android中设计模式--状态模式(将动作委托到当前状态,状态之间可以互相转换)
- Android的设计模式-状态模式
- java/android 设计模式学习笔记(19)---状态模式
- Android中的设计模式-状态模式
- Android中的设计模式-状态模式
- Android设计模式之(7)----状态模式
- Android设计模式之状态模式
- Android编程设计模式之状态模式详解
- Android设计模式应用--状态模式
- 【设计模式与Android】状态模式——一个人的两幅面孔
- Android 设计模式 笔记 - 状态模式
- Android 设计模式之状态模式
- Android设计模式(七)-状态模式