1,今天刚好看到了设计模式这一块来,而观察者模式是我一直想总结的,先来看看观察者模式的简单的定义吧 “当一个对象改变时,他的所有依赖者都会受到通知,并自动更新。” 一般我们项目中就是用在用户登录这一块,一些模块是只有用户登陆后才能进行浏览和进行操作的,现在以用户登录和未登录状态来举个栗子。

从大的方面来看,一般观察者模式存在一下四个基本的类:

抽象主题:抽象主题对象一般是一个接口,且里面包含最基础的添加观察者对象、移除观察者对象、通知观察者状态改变。

具体主题对象:针对主要是这个功能是用来干什么的,并实现上面抽象主题的基本的几个抽象方法。具体的操作试本次功能来定。

抽象观察者:抽象观察者一般是一个接口,且里面包含当被观察者的某一属性改变的时候去调用的方法。

具体的观察者:可以有多个,实现抽象观察者的方法。并实现自己的逻辑。

ok,既让我们已经有这个大的思路就来一点一点创建我们的代码吧···

首先常见抽象主题,本次的主题是用户的登录状态,创建一个Function的类来当抽象主题

package com.qianmo.VerificationCode.Observer;

/**
* Created by wangjitao on 2016/10/13 0013.
*/
public interface Function {
/**
* 添加
*/
public void addObserver(Observer observer); /**
* 移除
*/
public void removeObserver(Observer observer); /**
* 通知观察者更新
*/
public void notifyObserver(); }

这里我们观察者的抽象类Observer

package com.qianmo.VerificationCode.Observer;

/**
* Created by wangjitao on 2016/10/13 0013.
* 所有观察者需要实现此接口
*/
public interface Observer {
public void upLoginTag(boolean isLogin);
}

具体的主题对象LoginFuntion,实现Funtion接口

package com.qianmo.VerificationCode.Observer;

import java.util.ArrayList;
import java.util.List; /**
* Created by wangjitao on 2016/10/13 0013.
*/
public class LoginFunction implements Function { private List<Observer> observers = new ArrayList<>(); private boolean isLogin; @Override
public void addObserver(Observer observer) {
observers.add(observer);
} @Override
public void removeObserver(Observer observer) { } @Override
public void notifyObserver() {
for (Observer observer : observers) {
observer.upLoginTag(isLogin);
}
} public void setLoginTag(boolean isLogin) {
this.isLogin = isLogin;
notifyObserver();
} }

现在创建两个观察者对象,一个是购物车,当用户没登录的时候是不让进入购物车的,而是订单,同理。

ShopCatObserver

package com.qianmo.VerificationCode.Observer;

/**
* Created by Administrator on 2016/10/13 0013.
*/
public class ShopCatObserver implements Observer{
public ShopCatObserver(Function function){
function.addObserver(this);
} @Override
public void upLoginTag(boolean isLogin) {
System.out.println("购物车得到的登录状态: -->" + isLogin);
}
}

OrderObserver

package com.qianmo.VerificationCode.Observer;

/**
* Created by Administrator on 2016/10/13 0013.
*/
public class OrderObserver implements Observer {
public OrderObserver(Function function) {
function.addObserver(this);
} @Override
public void upLoginTag(boolean isLogin) {
System.out.println("订单得到的登录状态: -->" + isLogin);
}
}

这样我们的基本代码就写完了,现在添加一个测试类来测试测试

package com.qianmo.VerificationCode.Observer;

/**
* Created by wangjitao on 2016/10/13 0013.
*/
public class TestObserver { public static void main(String[] args) { LoginFunction loginFunction = new LoginFunction();
ShopCatObserver shopCatObserver = new ShopCatObserver(loginFunction);
OrderObserver orderObserver = new OrderObserver(loginFunction); loginFunction.setLoginTag(false); }
}

看一下我们控制台打印的信息

购物车得到的登录状态:  -->false
订单得到的登录状态: -->false

这时候将loginFunction.setLoginTag(false);换成loginFunction.setLoginTag(true); 再看看打印结果

购物车得到的登录状态:  -->true
订单得到的登录状态: -->true

这样当我们被观察的对象改变时候,观察者可以随着被观察的对象改变而改变,和接口回调类似~~~~

Android设计模式---观察者模式小demo(一)的更多相关文章

  1. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

  2. Android设计模式-观察者模式

    原文地址 http://blog.csdn.net/qq_25806863/article/details/69218968 观察者模式是一种使用频率非常高的设计模式,最常用的地方就是订阅-发布系统. ...

  3. Android实现登录小demo

    安卓,在小编实习之前的那段岁月里面,小编都没有玩儿过,如果说玩儿过,那就是安卓手机了,咳咳,敲登录的时候有种特别久违的熟悉,这种熟悉的感觉就和当时敲机房收费系统一样,那叫一个艰难啊,不过小编相信,在小 ...

  4. Android设计模式—观察者模式

    装载请标明出处:https://www.cnblogs.com/tangZH/p/11175120.html  观察者模式 说白了,就是一个对发生改变,所有依赖于它的对象也发生改变,这是一对多的关系. ...

  5. Android设计模式—— 观察者模式(以及EventBus的简单使用)

    1.概述 观察者模式最常用的地方是GUI系统.订阅-发布系统.观察者模式的一个重要作用就是解耦,将观察者和被观察者解耦,使得他们之间的依赖性更小. 2.定义 定义对象间的一种一对多依赖关系,使得每当一 ...

  6. Android -- 自定义View小Demo,绘制四位数随机码(一)

    1,现在有这样一个需求,实现显示随机随机数可能在代码中直接很简单的就实现了,但是现在我们直接自定义View来实现这个效果,那么我们来分析一波吧,我们允许开发者自己设置这个textview的大小,颜色, ...

  7. Android -- 自定义View小Demo,绘制钟表时间(一)

    1,昨天刚看了hongyang大神推荐的自定义时钟效果(传动门:http://www.jianshu.com/users/a45d19d680af/),效果还是不错的,自己又在github上找了找,发 ...

  8. Android -- 自定义View小Demo,关于Rect绘制Android机器人(一)

    1,关于Rect和RectF类的区别以前一直没有去关注它,刚刚了解了一下才知道都是用来确定矩形的区域,不过Rect是int类型的坐标而RectF是float类型的坐标,所以说RectF要更加精确.现在 ...

  9. Android -- 自定义View小Demo(一)

    1,现在要实现下图的简单效果,很简单  ,就是使用paint在canvas上绘制5中不同颜色的圆圈,效果图如下: 这是绘制基本图形一种最简单的方法,下面是它的代码 ,注释写的很详细,也就不去讲解了 M ...

随机推荐

  1. Lazarus for Raspbian安装

    春节前看到树莓派 2代开始销售,第一时间在淘宝下单购买,无奈春节期间放假,要到3月份才可能收到,只能用QEMU模拟器先熟悉树莓系统.对从turbo Pascal开始的人来讲,如果能在树莓系统使用Pas ...

  2. 【Android测试】【第七节】Monkey——源码浅谈

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4713466.html 前言 根据上一篇我们学会了Monke ...

  3. 【android学习4】Eclipse中Clean作用

    今天修改Servlet中代码,重启服务端程序之后发现没有启作用,于是Clean了一把,果然生效. 查阅资料得知,Eclipse中是根据时间戳去编译代码,如果某个类对应的时间戳没有发生改变就不会重新编译 ...

  4. Android笔记:Select at least one project解决办法

    导入项目的时候发现无法导入,最上方提示“Select at least one projec” 百度了一下,原来是和上一个项目名称相同了,直接把重名项目重命名后再导入即可.

  5. Android调用WCF

    http://www.cnblogs.com/davidgu/archive/2012/05/16/2504182.html

  6. asp.net 把数据导出为excel

    本篇介绍c#中如何使用DataTable导出Excel,至于其他的导出方法,这里不作介绍! 1.首页从数据库读取数据,得到DataTable: DataTable dt = HelperExecute ...

  7. Tomcat 处理请求时的中文乱码问题

    利用Tomcat8作为服务器,采用servlet接收前端请求后进行处理的过程中,前台请求中有中文时,中文信息变成了乱码. 经过调试和查阅,发现Tomcat在处理get请求和post请求是有区别的.参照 ...

  8. django http 403 错误

    在使用android的xUtils框架提交post请求到django服务器上面,出现错误,返回Forbiddeen.解决方法记录于此. 参考链接 http://blog.csdn.net/liangp ...

  9. 我的工具箱之TortoiseSVN-1.7.11.236000

    下载地址:http://pan.baidu.com/s/1hqY3h6c SVN windows版,项目团队合作必要的协作工具.

  10. TST fall detection database

    http://www.tlc.dii.univpm.it/blog/databases4kinect#IDFall2