从 “状态模式” 解析App登录功能实战技巧

一、绪

上篇博客和大家分享了ffmpeg的编译流程以及在AndroidStudio中集成。最近由于对ffmpeg的涉猎进展较慢,但是为了保持持续的狂暴之心,还是不能停止博客的更新。所以今天和大家分享一篇关于设计模式的内容。想必有些朋友看到设计模式几字就有点精神错乱,四肢麻木。哈哈,开个玩笑。我不会以单纯描述设计模式来表达,这样的博客随便一搜很多。既然要说设计模式,毕竟缺少不了实战的结合。

二、介绍

设计模式所带来的效益是显而易见的,23种设计模式体现了7种思想原则的守恒。大家最常用也最常听说的 单例模式、原型模式、工厂模式、观察者模式、建造者模式等等,同样很多模式在Android源码或者优秀的第三方开源库中体验的淋漓尽致。例如图片加载库,Glide,ImageLoader等等都以getInstance的方式使用了单例模式(双重锁检查机制),Android源码中AlertDialog使用build体现的建造者模式Intent提供的clone原型模式3.0后的属性动画插值器所体现的策略模式等等。本篇博客和大家分享一下状态模式的定义以及实战的使用。

三、状态模式的定义

状态模式包含了三种定义:

(1)控制器

(2)抽象状态或状态接口

(3)具体状态

怎么理解三者之间的关系呢?看下面展示图:

上图中,Context也就是控制器,即使用环境。State即为抽象状态或状态接口,Concrete

State

A,B即为具体的状态实现,即状态的具体行为。三者的关系显而易见,在Context中提供setState以注入的方式来改变不同的状态,体现不同状态下的不同行为。

四、简例

生活处处有设计模式。拿生活中的电视遥控器例子来说,在电视开机状态下,遥控器可以控制音量,频道切换等等,关机状态下,对于电视的任何操作都不能进行。

此时,遥控器就对应于Context,State对应于电视的状态,具体状态对应于电视的开机、关机:

代码描述如下:

(1)控制器接口,定义了两种状态的控制。

(2)具体控制器实现,实现状态的切换。

(3)状态接口

(4)开机状态

(5)关机状态

五、实战使用技巧

在我们平时开发的App应用中,肯定缺少不了登录功能。App客户端用户状态一般处于两种状态:

(1)登录状态

(2)注销状态(退出本次登录)

两种状态下对应的App权限是不同的。例如,App中有商品的收藏、分享功能、加入购物车、支付功能等等。

用户未登录状态时,可以进行商品分享操作,但不能对商品进行支付。反之,在用户登录后,即可进行商品收藏,商品下单支付等操作。

一般的做法是,会在每个功能模块下,在业务处理前,例如在收藏功能模块中,首先会对用户的状态进行判断,如果用户处于登录状态,处理收藏逻辑。否则跳转到登录界面,提示用户登录。如果功能模块较少的情况下,还是可以接受。

考虑一种场景:用户状态切换不同的情况下,会有多种不同的状态操作。此时需要在每个地方去做登录状态的判断,显而易见,这种方式非常繁琐。在后面的工作中,如果还有与用户状态相关的操作,都需要去作重复的业务逻辑。

伪代码:

了解到使用一般方式的弊端后,我们可以使用状态模式来解决此问题。经过上面的分析,我们可以得到如下信息:

(1)用户信息

(2)用户状态

(3)状态行为

1.首先定义两种状态,两种状态对应了不同的行为方式:

2.状态行为管理

3.Activity中使用

分析:

首先,定义了两个具体的状态类,并且实现了不用的行为处理方式。在登录状态下,可以进行收藏和支付。在未登录状态下,执行收藏和支付行为时,直接跳转到登录界面。

然后,为了不在Activity直接操作State的行为,避免了Activity和State耦合,引入了LoginContext单例类,以委托的方式通过状态类来管理State的行为和状态。

最后在Activity中通过LoginContext来执行具体操作:

首先默认状态是未登录状态,此时点击收藏和支付将跳转到登录界面。等点击登录后,状态变为登录状态,点击收藏或者支付将会进行具体我逻辑处理。

我们可以发现,整体代码逻辑上变得如此清晰,去掉了重复冗余的判断。

六、小结

从上面的实战中,不难发现。使用了状态模式后,代码逻辑变得清晰很多,减少了不必要的代码耦合。同样也可以发现,状态模式基本可以应用在不同状态下的同一行为的不同处理。减少了if else  或者switch的状态判断以及逻辑耦合。但是也同样增加了类和对象的个数。所以还需要我们在实际运用中根据需求来决策具体的使用方式。以上部分内容参考《Android源码设计模式》。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容