观察者模式详解Demo

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

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

假如:微信公众号是被观察者,那么微信公众号中的《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.

发布了75 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yaoyaoyao_123/article/details/95610808
今日推荐