Android设计模式之状态模式
来源:互联网 发布:手机熊猫 网络设置 编辑:程序博客网 时间:2024/05/20 21:59
前言
状态模式和策略模式结构几乎完全一样,但是他们的本质却完全不同。状态模式中的行为是平行的,不可替换的;策略模式的行为是完全独立,可以相互替换。
状态模式的理解
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设计模式之---状态模式
- Android设计模式之状态模式
- android设计模式之状态模式
- Android设计模式之状态模式
- Android 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之--状态模式
- 设计模式之状态模式
- The Imitation Game--你该知道艾伦·图灵
- 原生的JS编写图片的淡入淡出
- 我的CUDA学习之旅5——OTSU二值算法(最大类间方差法、大津法)CUDA实现
- UVALive 6255-状态搜索-Kingdoms
- 【目标检测】RCNN算法详解
- Android设计模式之状态模式
- python 学习--99乘法表
- 第七周项目四
- 让你了解操作系统基本概念
- UML类图与类的关系详解
- springMVC
- C++对象模型
- js中a标签的href属性不跳转方法
- html元素抓换