Android设计模式------状态变化模式
程序员文章站
2022-06-09 21:29:46
...
State 状态模式
使用场景
在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
模式定义
允许一一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
类图结构
代码举例
比如编写网络应用程序
public enum NetworkState //枚举方式是编译时依赖 更改的时候导致源代码更改
{ //有4种网络状态
Open,
Close,
Connect,
Waiting, //如果添加Waiting 就会添加修改代码 违背了开闭原则
}
//网络处理器
public class NetworkProcessor{
NetworkState state;
public void Operation1(){
switch (state){
case Open:
//**********
state = NetworkState.Close;
break;
case Close:
//..........
state = NetworkState.Connect;
break;
case Connect:
//$$$$$$$$$$
state = NetworkState.Open;
break;
}
}
public void Operation2(){
switch (state){
case Open:
//**********
state = NetworkState.Connect;
break;
case Close:
//..........
state = NetworkState.Open;
break;
case Connect:
//$$$$$$$$$$
state = NetworkState.Close;
break;
}
}
public void Operation3(){
//...
}
}
对代码进行重构
//支持了扩展的方式 支持需求变化
public abstract class NetworkState{
public NetworkState next;
public abstract void Operation1();
public abstract void Operation2();
public abstract void Operation3();
}
public class OpenState extends NetworkState{
//用多态的方式来实现状态的变化
@Override
public void Operation1(){
//**********
next = new CloseState();
}
@Override
public void Operation2(){
//..........
next = new ConnectState();
}
@Override
public void Operation3(){
//$$$$$$$$$$
next = new OpenState();
}
}
public class CloseState extends NetworkState{
@Override
public void Operation1(){
//**********
next = new ConnectState();
}
@Override
public void Operation2(){
//..........
next = new OpenState();
}
@Override
public void Operation3(){
//$$$$$$$$$$
next = new CloseState();
}
}
public class ConnectState extends NetworkState{ }
public class WaitingState extends NetworkState{ } //添加Waiting状态 对于NetworkProcessor类 没有影响
//...
//NetworkProcessor现在是稳定状态 不管状态如果改变 操作逻辑还是不变的
class NetworkProcessor{
NetworkState state;
public NetworkProcessor(NetworkState state){
this.state = state;
}
public void Operation1(){
//...
state.Operation1(); //多态方式 支持 运行时 变化
state = state.next; //状态改变
//...
}
public void Operation2(){
//...
state.Operation2(); //行为也跟着变化
state = state.next;
//...
}
public void Operation3(){
//...
state.Operation3();
state = state.next;
//...
}
}
类图结构中 State 对应代码中的 NetworkState。Context 对应代码中的 NetworkProcessor。
State 和 Context 是稳定的。ConcreteStateA 和 ConcreteStateB 是变化的。通过子类化支持变化,以扩展的方式应对新的变化需求。
要点总结
State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持
State的接口,这样实现了具体操作与状态转换之间的解耦。
为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一 致的情况,因为转换是原子性的一 即要么彻底转换过来,要么不转换。
如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。
上一篇: 2019前端面试题汇总(主要为Vue)
下一篇: Android O 新特性和行为变更总结