zoukankan      html  css  js  c++  java
  • 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
    

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

  • 相关阅读:
    P2114 [NOI2014]起床困难综合症(二进制)
    P4577 [FJOI2018]领导集团问题
    P5290 [十二省联考2019]春节十二响(堆+启发式合并)
    P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
    P4890 Never·island(dp)
    P2617 Dynamic Rankings(树状数组套主席树)
    P5241 序列(滚动数组+前缀和优化dp)
    P3243 [HNOI2015]菜肴制作(拓扑排序)
    【LeetCode每天一题】Combination Sum II(组合和II)
    【LeetCode每天一题】Combination Sum(组合和)
  • 原文地址:https://www.cnblogs.com/wjtaigwh/p/5956753.html
Copyright © 2011-2022 走看看