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. 【Java IO】FileInputStream 和 FileOutputStream

    class FileInputStream extends  InputStream implements Closeable

  2. qt cef嵌入web

    原文http://blog.sina.com.cn/s/blog_9e59cf590102vnfc.html 最近项目需要,研究了下libcef库. Cef(Chromium Embedded Fra ...

  3. 安装CentOS Core之后布置环境脚本

    #启动ssh服务 service sshd start #安装vim编辑器 echo y | yum install vim #安装网络工具包 echo y | yum install net-too ...

  4. node.js使用util实现简单继承

    /** * Created by zzq on 2015/5/15. */ var util = require('util'); var Person = function(){ var myD=' ...

  5. 20145211 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)

    实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 命令行下Java程序开发 IDEA下Java程序开发.调试 练习(通过命令行和IDEA ...

  6. 7Z命令行

    7-Zip (A) 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06 Usage: 7za <command> [<switch ...

  7. HTML5新特性总结

    一.HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.foote ...

  8. JS-005-常见下拉列表 Select 和 datalist

    下拉列表在我们日常的网页浏览的过程中,随处可见,是 web 编程过程中大家非常熟悉的一个页面元素,随着 HTML 语言的日益强大,其在广大攻城狮的手中可谓是千变万化,有了很多不同的实现方式.本文主要以 ...

  9. JS操作cookie以及本地存储(sessionStorage 和 localStorage )

    JS操作cookie cookie的操作用两种方式 1.substring //创建cookie function setCookie(name,value,expires,path,domain,s ...

  10. 让DIV中的内容水平和垂直居中

    让一个层水平垂直居中是一个非常常见的布局方式,但在html中水平居中使用margin:0px auto;可以实现,但垂直居中使用外边距是无法达到效果的.(页面设置height:100%;是无效的),这 ...