网站策划要遵循的原则,专业做网站产品上架的有吗,网站html地图怎么做的,昆明网站建设一条龙真知即所以为行#xff0c;不行不足谓之知 一#xff0c;定义
当一个对象的内在状态改变时#xff0c;允许改变其行为#xff0c;这个对象看起来像是改变了其类。
这么说可能很难理解#xff0c;通俗来讲就是当一个对象它有多种状态的时候#xff0c;把每一种状态的行为…真知即所以为行不行不足谓之知 一定义
当一个对象的内在状态改变时允许改变其行为这个对象看起来像是改变了其类。
这么说可能很难理解通俗来讲就是当一个对象它有多种状态的时候把每一种状态的行为都包装在一个状态对象里让一个对象在其内部状态改变的时候其行为也随之改变。
状态模式将每一个条件分支放入一个独立的类中这使得你可以根据对象自身的情况将对象的状态作为一个对象这一对象可以不依赖于其他对象而独立变化这样通过多态来去除过多的重复的if-else等分支语句。
二使用场景
1一个对象的行为取决于它的状态并且它必须在运行时根据状态改变它的行为。
2代码中包含大量与对象状态有关的条件语句。
三使用案例
假设我们的app有一种特殊场景有离线模式和在线模式离线模式下会进行一系列的操作比如加载缓存等在线模式下会进行一系列的操作比如请求网络等。
假如我们不使用状态模式通常代码是下面这样的
public class WorkEvent {private boolean isNet;public WorkEvent(boolean isNet) {this.isNet isNet;}public void doWork(){if(isNet){System.out.println(----请求服务器);System.out.println(----加载网络页面);}else {System.out.println(----读取本地缓存);System.out.println(----加载缓存页面);}}
}
使用时
//---------------连网-----------
ConfigManger.getEtnConfigRepository().saveNetState(true);//存到sp里网络状态
WorkEvent workEvent new WorkEvent(true);
workEvent.doWork();
//----------------断网---------------
ConfigManger.getEtnConfigRepository().saveNetState(false);//存到sp里网络状态
WorkEvent workEvent new WorkEvent(false);
workEvent.doWork();
这样做不仅需要在内存中存储网络状态还要在处理类中增加各种if-else判断逻辑看起来比较混乱。
接下来我们使用状态模式看看。
首先新建一个网络状态接口
public interface NetState {/*** 处理逻辑* */void dowork();/*** 获取当前网络状态* */boolean getNetState();
}
然后创建具体的网络状态类实现网络状态接口
public class OnLineState implements NetState{Overridepublic void dowork() {System.out.println(----请求服务器);System.out.println(----加载网络页面);}Overridepublic boolean getNetState() {return true;}
}
public class OffLineState implements NetState{Overridepublic void dowork() {System.out.println(----读取本地缓存);System.out.println(----加载缓存页面);}Overridepublic boolean getNetState() {return false;}
}
然后实现单例模式的网络状态上下文类要注意不要持有Activity引用避免内存泄漏问题
public class NetStateContext {private NetStateContext() {}// 私有的静态内部类private static class Holder {private static NetStateContext instance new NetStateContext();}// 开放的获取单例对象的方法public static NetStateContext getInstance() {return NetStateContext.Holder.instance;}private NetState netState new OnLineState();//默认在线public void setNetState(NetState netState) {this.netState netState;this.netState.dowork();}public boolean getNetState(){return netState.getNetState();}
}具体使用
//-------在线----
NetStateContext.getInstance().setNetState(new OnLineState());
System.out.println(当前在线状态NetStateContext.getInstance().getNetState());
//-------离线----
NetStateContext.getInstance().setNetState(new OffLineState());
System.out.println(当前在线状态NetStateContext.getInstance().getNetState());
输出 这样代码就看起来清晰多了而且状态的管理也不用去开辟内存存储了。在实际开发中状态模式的使用对我来说还是比较多的。
四总结
状态模式的关键点在于不同的状态下对于同一行为有不同的响应这其实就是一个将if-else替换的具体示例。当然并不是任何出现if-else的地方都应该通过状态模式重构。一定要结合实际的场景来综合评估。
优点状态模式将所有与一个特定的状态相关的行为都放入一个状态对象中它提供了一个更好的方法来组织与特定状态相关的代码将繁琐的状态判断转换成结构清晰的状态类族在避免代码膨胀的同时也保证了可扩展性与可维护性。
缺点状态模式的使用必然会增加类和对象的个数。 参考文献Android源码设计模式与解析第二版