观察者设计模式

2020-05-31  本文已影响0人  only_one
观察者设计模式是使用最频繁的设计模式之一,在很多的地方都用使用到,比如:RxJava,EventBus,以及GUI的各种事件中等等。
一、初步认识:
过年放假回家都需要提前买票,但是对于土豪就不需要买票了哈,往往都是通过小程序,App等一些渠道去购买,都怕错过抢票的时间,于是我们关注了12306购票小程序,进行购买火车票,买完之后就取消关注小程序。
上面存在几个角色小程序(被观察者 ),需要购买后车票的人(观察者)是用过关注将两者进行联系起来,当关注之后被观察者有状态改变,都会立即通知被观察者,观察者根据自己的情况做出相应的动作。
二、进步熟悉:
上面我们大概对观察者的作用有了浅层的认识,这对接下来的学习很有帮助。
1.首先来看一下观察者模式(Observe Pattern)的正经定义:定义对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
2.那么它如何实现这么神奇的功能的呢?
先来看一下它的结构图
image.png
从图中我们可以看到之前说的目标和观察者。只不过这里的目标和观察者都被抽象化了。我们来逐一认识:
(1)Observable(被观察者)
它是指被观察者的对象中,提供一系列对观察者进行管理的方法,比如addObserver()添加到集合中,removeObserver()从集合中移出去,nofityObservers()通知集合中所有的观察者,pushObservers()给集合中所有的观察者推送消息。
(2)WeChatServerObservable(具体目标)
当它的状态的改变时就会通知各个观察者,同时还实现了在目标类中定义的抽象逻辑方法(如果有的话)
(3)Observer(抽象观察者)
它是一个接口,观察者将对观察目标状态的改变做出相应的反应该接口定义了更新数据的方法update。
(4)UserPerson(抽象观察者)
它实现了抽象观察者对象的updata方法。
3.接下来通过一个代码实例来加深对上面的结构图的理解
目标Observable.java
interface Observable {
    //添加观察者
    fun addObserver(observer:Observer)
    //移除观察者
    fun removeObserver(observer: Observer)
    //推送消息给观察者
    fun pushObservers(message:Any)
    //通知所有的观察者
    fun nofityObservers()
}
具体目标类WeChatServerObservable.java
class WeChatServerObservable :Observable {

    private var observers:MutableList<Observer> = ArrayList()
    private var message:Any?=null;

    override fun addObserver(observer: Observer) {
        observers.add(observer!!)
    }

    override fun removeObserver(observer: Observer) {
        observers.remove(observer)
    }

    override fun nofityObservers() {
        observers.forEach {
            it.update(message!!)
        }
    }

    override fun pushObservers(message: Any) {
        this.message= message
        nofityObservers()
    }
}
观察者接口 Observer 定义一个更新的方法
interface Observer {
    fun update(mssage:Any)
}
具体的观察者 UserPerson.java
class UserPerson :Observer{
    private var name:String?=null
    constructor(name:String){
        this.name =name
    }
    override fun update(mssage: Any) {
        Log.e("TAG","$name----$mssage")
    }
}
最后测试:
public static void main(String[] args) {
        test();
    }
    public static void test(){
        //创建一个微信服务
        Observable observable =new WeChatServerObservable();
        //创建多个观察者
        Observer user1 =new UserPerson("小胖1");
        Observer user2 =new UserPerson("小胖2");
        observable.addObserver(user1);
        observable.addObserver(user2);
        //推送消息
        observable.pushObservers("明天早上八点开始抢票!");
    }

#######将两个观察者添通过addObserver()方法添加到观察者集合中,然后由目标来发送一条更新的消息。观察者接收到消息后做出反应。运行结果如下:

image.png
三、总结告别
优点:
1、观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息传递机制,并抽象了更新接口,使得可以有各种各样的表示层充当具体的观察者角色。
2、观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察者对象只需要维持一个抽象观察者的集合,无需了解其具体观察者。
3、观察者模式支持广播通信,观察目标会向所有已注册的观察者发送通知,降低了一对多系统的设计难度。
缺点:
1、如果是一对多的关系(被观察者与观察者)所有观察者收到消息,则需要花费大量的时间。
2、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。
上一篇下一篇

猜你喜欢

热点阅读