欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

观察者模式详解Demo

程序员文章站 2024-03-25 20:22:40
...

观察者模式细分的话可以分为以下几个具体对象:

观察者,具体观察者,被观察者,具体被观察者,以下通过一个小的应用场景具体详解:

假如:微信公众号是被观察者,那么微信公众号中的《Android前沿技术》这个订阅号就是一个具体的被观察者,微信用户就是观察者,个人就是具体观察者。

首先定义微信公众号类:


import com.example.myproject.observer.IWXUser;

import java.util.ArrayList;
import java.util.List;


/**
 * Created by hcDarren on 2017/10/14. 微信公众号
 * 微信公众号: 多个人去订阅我们的公众
 *
 * WXPublicObservable 和 IWXUser 关系? 1对多
 * WXPublicObservable 代表的不是具体的公众号,代表的是公众号
 */
public class WXPublicObservable {
    // 所有订阅的用户(公众号用户)
     public List<IWXUser> mWXUsers;

     public WXPublicObservable(){
        mWXUsers = new ArrayList<>();
     }

     /**
     * 订阅
     */
    public void register(IWXUser wxUser){
        mWXUsers.add(wxUser);
    }

    /**
     * 取消订阅
     * @param wxUser
     */
    public void unregister(IWXUser wxUser){
        mWXUsers.remove(wxUser);
    }

    /**
     * 更新文章
     * @param article
     */
    public void update(String article){
        // 推送文章更新
        for (IWXUser wxUser : mWXUsers) {
            wxUser.push(article);
        }
    }
}

其次定义一个具体的被观察者:


/**
 * Created by hcDarren on 2017/10/14.
 * 微信公众号 - Android进阶之旅公众号
 */

public class WXAdvanceObservable extends WXPublicObservable {
    private String article;

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;
        // 通知更新,推送给微信用户
        update(article);
    }
}

定义一个观察者——微信用户:

/**
 * Created by hcDarren on 2017/10/14.
 * 微信公众号 - 微信用户
 */
public interface IWXUser {
    public void push(String article);
}

定义一个具体的观察者:


/**
 * Created by hcDarren on 2017/10/14.
 * 微信公众号 - 具体订阅用户(Darren,高岩)
 */

public class WXUser implements IWXUser {

    private String name;

    public WXUser(String name) {
        this.name = name;
    }

    @Override
    public void push(String article) {
        System.out.println(name + " 收到了一篇文章:" + article);
    }
}

接下来定义一个测试类,测试具体的流程是不是能跑通:


import com.example.myproject.observable.WXAdvanceObservable;
import com.example.myproject.observer.WXUser;

/**
 * Created by hcDarren on 2017/10/14.
 */

public class Client {
    public static void main(String[] args){
        // 微信公众号 - 具体的被观察者 - Android进阶之旅
        WXAdvanceObservable wxAdvanceObservable = new WXAdvanceObservable();

        // 微信公众号 - 具体的观察者 - Darren,高岩
        WXUser darren = new WXUser("darren");
        WXUser gaoyan = new WXUser("高岩");

        // 微信公众号 - 用户订阅公众号
        wxAdvanceObservable.register(darren);
        wxAdvanceObservable.register(gaoyan);

        // 微信公众号 - 推送文章
        wxAdvanceObservable.setArticle("《代理设计模式 - 实现 Retrofit 的 create》");

        // 微信公众号 - 用户取消订阅公众号
        wxAdvanceObservable.unregister(darren);

        // 微信公众号 - 推送文章
        wxAdvanceObservable.setArticle("第三方框架 - EventBus 源码分析和手写");
    }

    // RXJava + OKHttp + Retrofit
}

以上便是一个简单的观察者模式Demo.