状态模式——《Android源码设计模式解析与实践》读书笔记8
定义
当一个对象的内在状态改变时,其行为也随之改变,从外部观察这个对象像是改变了类。
使用场景
(1)一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为。
(2)代码中包含大量与对象状态有关的条件语句。
UML类图
状态模式,多角色关键点
(1)状态模式和策略模式的结构几乎完全一样,但他们的目的、本质完全不一样。状态模式的行为是平行的、不可替换的;策略模式的行为是彼此独立、可相互替换的。
(2)状态模式将每一个条件分支放入一个独立的类中,使得使用者可以根据对象自身的情况将对象的状态作为一个可独立变化的对象。
(3)在不同的状态中对同一个请求做了不同的处理。
(4)状态模式的实质是将一个if-else或者switch-case用多态来实现。
实现方式
状态接口
public interface State{
int operation1();
int operation2();
}
状态A类
public class StateA implements State{
@Override
public int operation1(){
return 1;
}
@Override
public int operation2(){
return 0;
}
}
状态B类
public class StateB implements State{
@Override
public int operation1(){
return 0;
}
@Override
public int operation2(){
return 1;
}
}
Context类
public class Context{
State mState;
public void setState(State s){
this.mState= s;
}
public int operation1(){
return mState.operation1();
}
public int operation2(){
return mState.operation2();
}
}
调用例子:
public void class Test{
public static void main(String [] args){
StateA a = new StateA();
Context context = new Context();
context.setState(a);
context.operation1();
}
}
策略模式的优缺点
优点
将所有与一个特定状态相关的行为都放入一个状态对象中,将繁琐的状态判断转换成结构清晰的状态类族,避免代码膨胀,同时保证可扩展性和可维护性。
缺点
增加系统类和对象的个数
Android中的状态模式举例
Wifi的状态类State的子类,如初始状态子类InitialState,驱动加载状态子类DriverStartingState等
——2017.08.09