观察者设计模式(二) - 推拉模式

前言

观察者设计模式系列文章:
观察者设计模式(一) - 定义、角色划分、示例代码
观察者设计模式(二) - 推拉模式
观察者设计模式(三) - Java自带的观察者
观察者设计模式(四) - 源码中观察者设计模式的使用场景

1. 什么是推拉模式?


比如我们订阅的公众号:

  • 推送模式(push模式):比如订阅号有文章更新,主动推送一篇文章;
  • 拉模式(pull模式):如果我觉得有的文章真的很不错,我想主动去看看该文章;
  • 推拉模式结合:推模式 + 拉模式,既可以收到文章的推送,也可以自己主动拉取文章来阅读;

2. 推模式与拉模式区别?


推模式:被动的,由公众号推送过来的;
拉模式:主动的,自己主动去看文章的;

3. pull拉模式示例代码如下:

1>:PullWXPublicObservable,被观察者,微信公众号
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:03
 * Version 1.0
 * Params:
 * Description:    微信公众号 - 多个人去订阅的公众号
*/

public class PullWXPublicObservable {

    // 所有订阅用户的集合
    private List mWXUsers ;
    public PullWXPublicObservable(){
        mWXUsers = new ArrayList<>() ;
    }


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

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

    /**
     * 文章更新
     */
    public void update(String article){
        // 推送所有更新的文章
        for (IPullWXUser wXUser : mWXUsers) {
            wXUser.pull(this);
        }
    }
}
2>:PullWXAdvanceObservable,具体的被观察者 - 鸿阳的微信公众号;
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:12
 * Version 1.0
 * Params:
 * Description:    具体的被观察者 - 鸿阳的微信公众号
*/

public class PullWXAdvanceObservable extends PullWXPublicObservable {

    private String article ;

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;

        // 通知更新,推送给微信用户
        update(article);
    }
}
3>:IPullWXUser,观察者,微信用户
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:06
 * Version 1.0
 * Params:
 * Description:    微信用户 - 订阅该微信公众号
*/

public interface IPullWXUser {

    /**
     * 把公众号给用户
     */
    void pull(PullWXPublicObservable wxObservable) ;
}
4>:PullWXUser,具体的观察者,Novate,wangziwen
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:14
 * Version 1.0
 * Params:
 * Description:    具体的用户 - 订阅鸿阳的微信公众号
*/

public class PullWXUser implements IPullWXUser {

    private String name ;

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

    @Override
    public void pull(PullWXPublicObservable wxPublicObservable) {
        // 拉模式 - 主动的从公众号中拉取一篇文章
        PullWXAdvanceObservable advanceObservable = (PullWXAdvanceObservable) wxPublicObservable;
        System.out.println(name+"主动拉取一篇文章:"+advanceObservable.getArticle());
    }
}
5>:测试代码如下:
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 16:03
 * Version 1.0
 * Params:
 * Description:
*/

public class Client {
    public static void main(String[] args){

        // 具体的被观察者 - 微信公众号 - 鸿阳的公众号
        PullWXAdvanceObservable wxAdvanceObservable = new PullWXAdvanceObservable() ;

        // 具体的观察者 - 微信公众号 - Novate
        PullWXUser novate = new PullWXUser("novate") ;
        PullWXUser wangziwen = new PullWXUser("wangziwen") ;

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

        // 微信公众号 - 推送文章
        wxAdvanceObservable.setArticle("《观察者设计模式 - 定义及事例代码》");

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

运行结果如下图所示:

观察者设计模式(二) - 推拉模式_第1张图片
图片.png

4. push推模式示例代码如下:


push推模式和上一节的示例代码一模一样,只是修改下名字就可以

1>:PushWXPublicObservable,被观察者,微信公众号
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:12
 * Version 1.0
 * Params:
 * Description:    具体的被观察者 - 鸿阳的微信公众号
*/

public class PushWXAdvanceObservable extends PushWXPublicObservable {

    private String article ;

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;

        // 通知更新,推送给微信用户
        update(article);
    }
}
2>:PushWXAdvanceObservable,具体的被观察者,鸿阳的微信公众号
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:12
 * Version 1.0
 * Params:
 * Description:    具体的被观察者 - 鸿阳的微信公众号
*/

public class PushWXAdvanceObservable extends PushWXPublicObservable {

    private String article ;

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;

        // 通知更新,推送给微信用户
        update(article);
    }
}
3>:IPushWXUser,观察者,微信用户
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:06
 * Version 1.0
 * Params:
 * Description:    微信用户 - 订阅该微信公众号
*/

public interface IPushWXUser {

    /**
     * 读文章
     */
    void push(String article) ;
}
4>:PushWXUser,具体的观察者,Novate、wangziwen;
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:14
 * Version 1.0
 * Params:
 * Description:    具体的用户 - 订阅鸿阳的微信公众号
*/

public class PushWXUser implements IPushWXUser {

    private String name ;

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

    @Override
    public void push(String article) {
        System.out.println(name+"收到了一篇文章:"+article);
    }
}
5>:测试代码如下:
/**
 * Email: [email protected]
 * Created by Novate 2018/5/27 15:16
 * Version 1.0
 * Params:
 * Description:
*/

public class Client {
    public static void main(String[] args){

        // 具体的被观察者 - 微信公众号 - 鸿阳的公众号
        PushWXAdvanceObservable wxAdvanceObservable = new PushWXAdvanceObservable() ;

        // 具体的观察者 - 微信公众号 - Novate
        PushWXUser novate = new PushWXUser("novate") ;
        PushWXUser wangziwen = new PushWXUser("wangziwen") ;

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

        // 微信公众号 - 推送文章
        wxAdvanceObservable.setArticle("《观察者设计模式 - 定义及事例代码》");

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

你可能感兴趣的:(观察者设计模式(二) - 推拉模式)