Android设计模式---观察者模式小demo(一)
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
这样当我们被观察的对象改变时候,观察者可以随着被观察的对象改变而改变,和接口回调类似~~~~