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

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

posted @ 2016-10-13 15:52  阿呆哥哥  阅读(1476)  评论(0编辑  收藏  举报