设计模式整理(7) 状态模式
2019-02-14 本文已影响0人
安静的蓝孩子
学习《Android 源码设计模式解析与实践》系列笔记
介绍
状态模式和策略模式都是行为型模式。
状态模式中的行为是由状态来决定的,不同的状态下有不同的行为。状态模式和策略模式的结构基本一样,但是它们的目的、本质是完全不一样的。
策略模式是封装一系列彼此独立、复杂多变、可替换的实现方式。状态模式是把对象的内在状态的变化封装到不同的状态对象里,状态变化时,其行为也随之改变。
定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 代码中包含大量与对象状态有关的条件语句。
结构
状态模式 UML 图- Context : 环境类,维护了一个 State 子类实例,这个实例定义了对象的当前状态及行为。
- State : 抽象状态类。
- ConcreteStatteA/B : 具体状态类,实现了具体状态下的行为。
实现
比如说电视在开机和关机的两个状态下的遥控器不同行为。
开机状态:遥控器可以控制上一个频道、下一个频道、提高音量、调低音量、关机。
关机状态:遥控器只可以控制开机,其它的都只是闪红灯提示未开机。
/**
* 电视状态抽象类
*/
public abstract class TvState {
public abstract void nextChannel();
public abstract void prevChannel();
public abstract void turnUp();
public abstract void turnDown();
}
/**
* 关机状态,此时只有开机功能时有效
*/
public class PowerOffState extends 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 PowerOnState extends 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("调低音量");
}
}
**
* 电视遥控器,相当于 Context 角色
*/
public class TvController {
private TvState mTvState;
public void setTvState(TvState tvState) {
mTvState = tvState;
}
public void powerOff() {
mTvState = new PowerOffState();
System.out.println("关机啦");
}
public void powerOn() {
mTvState = new PowerOnState();
System.out.println("开机啦");
}
public void nextChannel() {
mTvState.nextChannel();
}
public void prevChannel() {
mTvState.prevChannel();
}
public void turnUp() {
mTvState.turnUp();
}
public void turnDown() {
mTvState.turnDown();
}
}
public class Client {
public static void main(String args[]) {
TvController tvController = new TvController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnUp();
tvController.powerOff();
tvController.nextChannel();
}
}
开机啦
下一个频道
调高音量
关机啦
闪红灯提示未开机
总结
优点:
状态模式将所有与一个特定状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同时也保证了可扩展性和可维护性。
缺点:
状态模式的使用必然会增加系统类和对象的个数。
相关文章:
设计模式整理(1) 代理模式
设计模式整理(2) 单例模式
设计模式整理(3) Builder 模式
设计模式整理(4) 原型模式
设计模式整理(5) 工厂模式
设计模式整理(6) 策略模式
设计模式整理(7) 状态模式
设计模式整理(8) 责任链模式
设计模式整理(9) 观察者模式
设计模式整理(10) 适配器模式
设计模式整理(11) 装饰模式
设计模式整理(12) 中介者模式