摘要:参考设计模式可复用面向对象软件的基础状态对象行为型模式源码设计模式解析与实战第章随遇而安状态模式意图允许一个对象在其内部状态改变时改变它的行为。所以已登录和未登录状态下的评论行为是不同的,这个就可以用状态模式设计。
参考
《设计模式:可复用面向对象软件的基础 》5.8 State 状态 对象行为型模式
《Android源码设计模式解析与实战》第7章 随遇而安--状态模式
意图允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
别名状态对象(Objects for States)
适用场景一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
一个操作中含有庞大的多分支的条件语句,且这些操作分支包含这一相同的状态。这个状态通常用一个或多个枚举常量表示。
状态模式将每一个条件分支放入到一个独立的类中,这使得你可以根据对象自身的情况将对象状态作为一个对象,这一对象可以不依赖于其它对象而独立变化,这样可以通过多态来去除多的,重复的if-else等分支语句。
结构Context 环境类,定义客户需要的接口,维护一个State子类的实例,这个实例定义了当前环境的状态。
State 抽象状态类或者状态接口,定义一个或者一组接口,便是该状态下的行为。
ConcreteStateA,ConcreteStateB 具体状态类,每一个具体的状态类实现抽象State中定义的接口,从而达到不同状态下的不同行为。
优点State模式将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换为结构清晰的状态类族,再避免代码膨胀的同时也保证了可扩展性与可维护性。
缺点增加了系统类和对象的个数。
应用例子1 电视遥控器 描述电视的状态分为开机和关机状态,开机可以进行频道切换,调整音量等操作,但是这时重复开机键是无效的;关机状态下,频道切换,调整音量,关机都是无效的操作,只有按开机键会生效。
结构 代码实现/** * 电视不同状态下的相同抽象行为接口 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:30 */ public interface TvState { /** * 音量调高 */ void turnOn(); /** * 音量调低 */ void turnOff(); /** * 下一个频道 */ void nextChannel(); /** * 上一个频道 */ void preChannel(); } /** * 关机状态下的行为实现 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:22 */ public class PowerOffState implements TvState { @Override public void turnOn() { // 没有实现即失灵 } @Override public void turnOff() { // 没有实现即失灵 } @Override public void nextChannel() { // 没有实现即失灵 } @Override public void preChannel() { // 没有实现即失灵 } } /** * 开机状态下的行为实现 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:22 */ public class PowerOnState implements TvState { @Override public void turnOn() { System.out.println("音量调高"); } @Override public void turnOff() { System.out.println("音量调低"); } @Override public void nextChannel() { System.out.println("切换到了下一个频道"); } @Override public void preChannel() { System.out.println("切换到了上一个频道"); } } /** * 电视机遥控器类 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:29 */ public class TvController { private TvState state; public void powerOn(){ this.state = new PowerOnState(); System.out.println("已开机"); } public void powerOff(){ this.state = new PowerOffState(); System.out.println("已关机"); } public void turnOn() { state.turnOn(); } public void turnOff() { state.turnOff(); } public void nextChannel() { state.nextChannel(); } public void preChannel() { state.preChannel(); } }应用例子2 Android源码中的WifiDriverState
后更
应用例子3 App中的不同登陆状态下的执行行为比如应用在已登录状态,点击评论,会正常弹出评论框,而未登录状态下,则是要跳转到登录界面登录后,再正常评论。
所以已登录和未登录状态下的评论行为是不同的,这个就可以用状态模式设计。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/14384.html
摘要:因此我们知道,观察者模式中主要有观察者和被观察者个对象,而在观察模式中表示被观察者,由于这个对象是一个抽象类,所以只能被继承。 观察者模式(Observer Pattern)定义对象间的一种一个(Observable)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。当然,MVC只是Observer模式的一个实例。Observer...
摘要:该始终是其唯一仅有的成员,由此启动的任何,如果没有指定返回栈名称,则新启动的放入默认的返回栈如果指定了返回栈名称,则将新启动的放入指定的返回栈中。 1. 简介 本篇不针对于新手,而是对于Activity中一些常识或者问题进行总结。Activity是Android四大组件之一,为用户提供与系统交互的界面,每一个应用都有一个或者多个Acticity,这样会有各种各样的细节问题...
摘要:该始终是其唯一仅有的成员,由此启动的任何,如果没有指定返回栈名称,则新启动的放入默认的返回栈如果指定了返回栈名称,则将新启动的放入指定的返回栈中。 1. 简介 本篇不针对于新手,而是对于Activity中一些常识或者问题进行总结。Activity是Android四大组件之一,为用户提供与系统交互的界面,每一个应用都有一个或者多个Acticity,这样会有各种各样的细节问题...
摘要:反正我觉得自己手写,懒得写,经常见到的情况是一个来处理多个子线程发来的消息,不是就是还要做一些变换啥的,还要考虑有没有内存泄漏情况,子线程任务要能及时取消等等有点烦,除非你设计好了一个良好的封装。 参考 《设计模式:可复用面向对象软件的基础 》5.7 Observer 观察者 对象行为型模式 《设计模式解析》 18.4 Observer模式 《Android源码设计模式解析与实战》第...
摘要:四种状态运行状态暂停状态停止状态销毁状态运行状态处于返回栈的栈顶位置,正在运行与用户发生着交互,系统不愿回收此种状态的。和都是为了解决重复创建问题,的作用域是栈顶,的作用域是整个返回栈。 Context Android 系统组件不同于普通类对象,能够直接创建实例,需要各自的上下文环境——Context。 Context 上下文环境确保 Android 系统组件(Activity、Se...
阅读 222·2023-04-25 16:38
阅读 2415·2021-10-11 10:58
阅读 1311·2021-09-26 09:46
阅读 3140·2021-09-08 09:35
阅读 2626·2019-08-30 12:54
阅读 3130·2019-08-29 17:06
阅读 823·2019-08-29 14:06
阅读 3224·2019-08-29 13:00