设计模式-观察者设计模式

现在是晚上7点半相信不少哥们还在跟我一样奋战在公司第一线,不过我的情况特殊一些可能,我是留下来分享下最近所学的东西,希望能帮助到其他的哥们儿,可能其他的哥们儿是在写公司的项目功能代码,希望各位老铁注意身体别熬得太晚。

首先我们先看我要讲的内容的结构图,如下。
观察者被观察者关系图
我要讲的东西结构大致如下被观察者通过register注册观察者,当执行被观察者的update方法后我们会循环执行观察者的push方法将处理的内容发送给观察者,当我们执行unregister方法后将观察者移除观察者从此将不再获取被观察者发布的内容。

首先我们要写我们的被观察者代码如下。(代码参考自Darren大神)

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);
        }
    }
}

这里我们写的是一个公共的观察者具有功能为register订阅观察者,unregister取消订阅观察者,update推送文章是不是跟图上画的一致啊。
下面是我们的具体的观察者。

public class WXAdvanceObservable extends WXPublicObservable {
    private String article;

    public String getArticle() {
        return article;
    }

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

这里封装了一个具体的文章的get,set方法在set方法中执行我们的推送发送消息的处理。

接下来来写我们的订阅者即观察者我们首先定义一下订阅者的规范代码如下

public interface IWXUser {
    public void push(String articalName);
}

接下来使我们的具体观察者代码也是很简单


public class WXUser implements IWXUser {
    String userName;

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

    @Override
    public void push(String articalName) {
        System.out.println(userName + " 收到了一篇文章名称为: " + articalName);
    }
}

最后就是我们的调用过程了


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 源码分析和手写");
    }
}

看看调用的过程是不是跟我前面图片上介绍的很相似,后面的文章我们会对观察者被观察者进行更深入的介绍希望这篇文章能帮助到你们,大家有什么问题欢迎提问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值