Java/Android设计模式<二>观察者模式

在android中观察者模式比较常见比如eventBus Rxjava等 也都是观察者模式;下面来介绍一下观察者模式:

1.观察者模式简单介绍:

在android中观察者模式分为观察者和被观察者两部分:

观察者:就是Observer;在rxjava中被称为Sucscriber;
被观察者:就是Observ’a’bvable,有时候会被称为主题:Sububject;

一般情况下被观察者会通知观察者跟新;从而实现被观察者订阅观察者;
举一个简单的例子:(button的点击事件订阅)

 mLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

button:mLogin就是被观察者 —->通过setOnClickListener来订阅View.OnClickListener—–>当button:mLogin呗点击时候,通知OnClickListener调用onClick()方法

2.代码实现观察者模式:

在开始之前先介绍要实现的功能:
1.设置两个观察者;
2.被观察者订阅观察者的逻辑和取消订阅的逻辑;
3.被观察者notifyData()时候 观察者做出响应

2.1
作为数据载体先设置javabean:

package com.example.test.bean;

/**
 * Created by houruixiang on 2017/8/22.
 */

public class SimpleInfo {

    private String name;
    private String sex;
    private String age;
    private String state;

    public SimpleInfo(Builder builder) {
        this.name = builder.name;
        this.sex = builder.sex;
        this.age = builder.age;
        this.state = builder.state;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }


    @Override
    public String toString() {
        return "SimpleInfo{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age='" + age + '\'' +
                ", state='" + state + '\'' +
                '}';
    }


    public static class Builder{

        private String name;
        private String sex;
        private String age;
        private String state;


        //这里之所以有返回值是为了支持链式编程

        public Builder name(String name){
            this.name = name;
            return this;

        }

        public Builder sex(String sex){
            this.sex = sex;
            return this;
        }

        public Builder age(String age){
            this.age = age;
            return this;
        }

        public Builder state(String state){
            this.state = state;
            return this;
        }

        public SimpleInfo build(){
            return new SimpleInfo(this);
        }



    }
}

2.2
设置观察者和被观察者:
//被观察者:

public class Observable<T> {

    private List<Observer<T>> mObservers = new ArrayList<>();

    //注册被观察者
    public void register(Observer<T> observer){
        if (observer == null){
            throw new NullPointerException("observer 不能等于 null");
        }
        synchronized (this){
            if (!mObservers.contains(observer)){
                mObservers.add(observer);
            }
        }
    }


    //解锁被观察者
    public synchronized void unregister(Observer<T> observer){
        if (observer != null){
            mObservers.remove(observer);
        }
    }


    public void notifyData(T data){
        for (int i = 0; i < mObservers.size(); i++) {
            Observer<T> observer = mObservers.get(i);
            observer.onUpdataData(data);
        }
    }



}

在被观察者中自定义了 register 和unregister—>相当于被观察者订阅观察者的绑定和解绑;
//观察者:

public interface Observer<T> {
    void onUpdataData(T data);
}

2.3
核心逻辑
在这里自定义的被观察者和观察者就全部定义完成;然后再来看MainActivity的实现逻辑;
首先是注册两个观察者–>完成注册:

infoObservable = new Observable<>();
        //创建被观察者
        Observer<SimpleInfo> firstObserver = new Observer<SimpleInfo>() {
            @Override
            public void onUpdataData(SimpleInfo data) {
                mFirst.setText("观察者1: " + data.toString());
            }
        };
        Observer<SimpleInfo> secondObserver = new Observer<SimpleInfo>() {
            @Override
            public void onUpdataData(SimpleInfo data) {
                mSecond.setText("观察者2: " + data.toString());
            }
        };


        //注册
        infoObservable.register(firstObserver);
        infoObservable.register(secondObserver);

被观察者更新data,观察者做出响应:

   SimpleInfo simpleInfo = new SimpleInfo.Builder()
                .name("小白")
                .sex("男")
                .age("15")
                .state("AC_Ml")
                .build();
        infoObservable.notifyData(simpleInfo);

实际结果如下:
这里写图片描述

//然后再notifyData之前 对第二个观察者解除注册的绑定:

SimpleInfo simpleInfo = new SimpleInfo.Builder()
                .name("小白")
                .sex("男")
                .age("15")
                .state("AC_Ml")
                .build();

        infoObservable.unregister(secondObserver);
        infoObservable.notifyData(simpleInfo);

结果如下:
这里写图片描述

这样 观察者模式就一目了然:

首先被观察者注册观察者—–>当被观察者notifyData时候,注册过的观察者做出相关响应—–>解除注册则:被观察者notifyData()观察者的数据不更新

到此就介绍完了 个人认为思路还算清晰 希望可以对大家有所帮助

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值