文档章节

Android源码设计模式解析与实战(八)

_
 _OUTMAN_
发布于 2017/02/22 22:28
字数 550
阅读 44
收藏 0
点赞 0
评论 0

1. 状态模式介绍

状态模式的行为由状态来决定,不同的状态下有不同的行为。状态模式把对象的行为包装在不同的状态对象里,每一个对象状态都有一个共同的抽象状态基类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

2. 状态模式的使用场景

(1) 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。

(2) 代码中包含大量与对象状态有关的条件语句

状态模式将每一个条件分支放入一个独立的类中,这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

3. 个人理解:

(1) 将不同状态的变量抽象成状态对象

(2) 将不同状态的操作统一抽象成接口,状态对象分别实现接口

(3) 调用者使用不同状态对象去执行操作

4. 状态模式实战

状态模式最常见的地方应该是用户登录系统

分享、评论操作,未登录用户需要先登录、登录用户可以分享和评论。

public class LoginContext {
    // 用户状态
    UserState mState = new LogoutState();
    
    static LoginContext mInstance = new LoginContext();
    private LoginContext() {
    }
    public static LoginContext getInstance() {
        return mInstance;
    }

    // 设置成package访问权限,和登录模块在同一package,即只能通过登录模块更改用户状态
    void setUserState(UserState state) {
        this.mState = state;
    }

    public void share(Context context) {
        mState.share(context);
    }
    public void comment(Context context) {
        mState.comment(context);
    }
    // 不使用状态模式,则需要使用if...else判断
    /*
    private void deal(Context context) {
        if (logined) {
            ......
        } else {
            gotoLoginActivity(context);
        }
    }
    */
}
public interface UserState {
    void share(Context context);
    void comment(Context context);
}

public class LoginState implements UserState {
    @Override
    public void share(Context context) {
        Toast.makeText(context, "分享", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void comment(Context context) {
        Toast.makeText(context, "评论", Toast.LENGTH_SHORT).show();
    }
}
public class LogoutState implements UserState {
    @Override
    public void share(Context context) {
        gotoLoginActivity(context);
    }
    @Override
    public void comment(Context context) {
        gotoLoginActivity(context);
    }
    private void gotoLoginActivity(Context context) {
        Intent intent = new Intent(context, LoginActivity.class);
        context.startActivity(intent);
    }
}

 

© 著作权归作者所有

共有 人打赏支持
_
粉丝 20
博文 130
码字总数 55043
作品 0
海淀
程序员
ListView 数据与UI更新机制之观察者模式

之前有一篇文章专门介绍观察者模式知识,当时通过EventBus来进行分析。近日在读《Android源码设计模式解析与实战》,看到书中介绍ListView中使用到观察者模式。为了加深对观察者模式的理解,...

Tifkingsly
07/13
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊
06/21
0
0
(一)Android中的单例模式

作为一个Android开发的老司机,或者刚入行的司机,我觉得你还是有必要学习下Android的单例模式,毕竟 单例模式是我们很常用的一个设计模式。 1. 介绍 1.1 定义 确保某一个类只有一个实例,而...

24K男
04/25
0
0
基于 MVP 架构使用Android通用开发框架快速开发微博项目实战

课程目标: 基于 MVP 架构使用Android通用开发框架快速开发微博项目实战 适应人群: 适合大学生和初中级android开发工程师,可以系统化的微博类APP的开发,系统化掌握商业化项目的开发。* 不...

13122542396
05/25
0
0
android 设计模式的应用

1 职责链模式 职责链模式的意图为:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。使...

小克898
2014/08/24
0
0
android与模式:写之前的一点话

一直都喜欢研究模式,学习和使用也有很多年了,因为爱好,也因为需要。技术总是需要提高,兴趣在于看源码中领略到的精彩。对于设计模式,一直以来,断断续续的反复温习着,看看这个,看看那个...

今幕明
2014/03/06
0
0
android与模式:单例模式

这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程。 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程。 隐藏创建方式,就...

今幕明
2014/03/12
0
0
缅甸银河国际赌场开户13170533331

1.概念:将内容与控件相分离的一种设计(公式) ,达到内容灵活显示的目的。 2.适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。单独讲解接口的适配器模式 a. 接...

银河国际
05/26
0
0
Android也架构之二:单例模式访问网络

oschina中没有代码插入,看带有代码的文章挺费劲的,如果你和我一样 请移步:http://blog.csdn.net/michaelyy/article/details/7883621 或者我的个人网站 http://www.devchina.com 首先我们来...

理工男海哥
2012/08/19
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot 整合 MyBatis/通用Mapper/PageHelper分页插件

整合MyBatis 整合通用Mapper 1. POM依赖配置 <properties><mapper.starter.version>2.0.3-beta1</mapper.starter.version></properties><!-- 通用Mapper --><dependency><groupId>t......

OSC_fly
8分钟前
0
0
CentOS7 双网卡绑定

环境 操作系统 CentOS7.5,禁用 NetworkManager 服务 网卡 eth0 网卡 eth1 绑定网卡 bond0 网卡 eth0 配置 修改 /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=EthernetBOOTPROTO=noneD......

Colben
10分钟前
0
0
zk实战--rpc框架集群化

在看此篇内容时需要浏览下面内容 netty实战--手写rpc框架 前文功能简介以及功能扩充 利用netty来实现一个点对点的rpc调用。客户端和服务端都是靠手写地址进行socket同学的,无法1对多,也无法...

xpbob
26分钟前
10
0
springboot 发送邮件

获取授权码 添加配置 # 账号和密码spring.mail.username=aaa@qq.comspring.mail.password=bbb# 服务器地址spring.mail.host=smtp.qq.comspring.mail.properties.mail.smtp.ssl.en...

阿豪boy
26分钟前
0
0
如何使用GNU Ring?

文章名:如何使用GNU Ring? 作者:冰焰火灵X 1079092922@qq.com 文章许可:CC BY-SA 4.0 ##1. 安装 下载GNU Ring 点击左边选择你的系统版本(这里以 GNU/Linux 为例,我使用的是Mint 18.3)...

ICE冰焰火灵X
29分钟前
4
0
深入理解springMVC

什么是spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而...

Java填坑之路
35分钟前
1
0
《射雕英雄传》书摘

1. 我虽是个飘泊江湖的贫家女子,可不是低三下四、不知自爱之人。你如真心爱我,须当敬我重我。我此生决无别念,就是钢刀架颈,也决意跟定了你。将来……将来如有洞房花烛之日,自然……自能...

k91191
45分钟前
0
0
解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件

最近项目中发现了一个bug,具体表现为选中模态框上datepicker组件上的日期时,会触发模态框的关闭事件,导致数据编辑无法正常进行。网上搜索了下,解决方法如下: $('.datepicker').on('hid...

Funcy1122
49分钟前
0
0
Redis分布式锁的正确实现方式

前言 分布式锁一般有三种实现方式: 1.数据库乐观锁 2.基于Redis的分布式锁; 3.基于Zookeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis...

大海201506
今天
2
0
ClassNotFoundException: javax.el.ELManager

这个是因为tomcat7中的el-api2.2,有些版本太低,建议升级tomcat到8.0,利用el-api3.0就会解决这个问题。

无语年华
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部