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. install zabbix-agent on CENTOS

    in ubuntu--https://www.digitalocean.com/community/tutorials/how-to-install-zabbix-on-ubuntu-configur ...

  2. jdk 8 lambda表达式 及在Android Studio的使用示例

    以前觉得java让人觉得有趣的一个特点是支持:匿名内部类,而最近发现jdk8已支持lambda并有更简便的方式,来实现匿名内部类. 这会让程序员更舒服,更喜欢java. 多年前觉得java语法和C#语 ...

  3. CSS3新添加的属性

    1.圆角设置 border-radius:15px 50px 30px 5px; /*四个值: 第一个值为左上角,第二个值为右上角,第三个值为右下角,第四个值为左下 角. 三个值: 第一个值为左上角, ...

  4. Snort规则中的逻辑关系

    0x01 看一条规则alert tcp any any -> any any (content:"union";http_uri;nocase;content:"s ...

  5. ORA-01000:超出打开游标的最大数(C#)

    在做一个windows服务,通过查询文本不断的插入数据的功能.测试一直没有问题,到实际环境中跑起来后程序退出,查看日志发现报的这个错误 ORA-01000:超出打开游标的最大数 经过上网查询发现是由于 ...

  6. <dependency>spring-webmvc</dependency>

    Spring 4.2.0.RELEASE版本: <dependency> <groupId>org.springframework</groupId> <ar ...

  7. 打造安全的App!iOS安全系列之 HTTPS

    如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方面的考虑普遍比较欠缺,而由于iOS平台的封闭性,遭遇到的安全问题相比于Android来说要少得多 ...

  8. mouseenter(fn)和mouseleave、mouseover和mouseout的的区别

    $('.box1').mouseenter(function(){//穿入事件mouseenter $(this).css('background','red'); }).mouseleave(fun ...

  9. Python开发【第二章】:Python的数据类型

    基本数据类型 一.整型 如: 18.73.84 整型具备如下功能: class int(object): """ int(x=0) -> int or long i ...

  10. 使用weave实现跨主机docker容器互联

    关于weave的原理不做细致的说明,如果想了解weave可以登陆官网:https://www.weave.works/ In this post,使用阿里云3台ECS服务器进行weave搭建,并测试搭 ...