观察者模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

.观察者模式

.1. Vue框架实现了MVVM模式即model view  modelView, view视图层的变化都会引起modelview的变化而modelview的变化会导致view层重新渲染,其中数据观测的原理应该就是观察者模式的运用,data(被观察者)中的属性自动封装成get set 每个属性都会自动绑定当前的watcher(观察者)当前watcher成为data的依赖,,当data发生变化的时候,会通知watcher,watcher再进行试图的渲染

2.观察者模式很简单:

 

例子:电影院里面放映的电影是每个人都可以去看的,那么被观看的电影就是被观察者,而观众就是观察者,具体的电影可以添加观众,也可以删除观众(当然是假设),当电影更新了来通知观众。

当然电影不是只有一部一种类型,还有多种多样的类型,这是就抽象被观察者,而观众同样也是也要抽象出观察者

 

主要有观察者和被观察者,当然观察的对象不止一个,被观察的对象也不只一个,所以为了高可用以及可扩展性我们需要出现出抽象的观察者和抽象的被观察者四个角色

观察者

被观察者

抽象观察者

抽象被观察者

抽象被观察者可以添加、删除和通知观察者。观察者可以主动或者被动获得被观察者的信息从而改变自己

 

具体实现如下:

抽象观察者

package watchermodel;
 
public abstract class Watcher {
    //被观察者更新会通知观察者做某种操作,也可以添加参数获取被观察者通知的信息
 public abstract void update()

 

抽象被观察者

package watchermodel;
 
public interface Watched {
    //添加观察者
    public void addWatcher(Watcher watcher);
    //删除观察者
    public void removeWatcher(Watcher watcher);
    //通知观察者
    public void noticeWatcher();
}

 

 

 

具体的观察者

package watchermodel;
public class CustomA extends Watcher {
    @Override
    public void update() {
       // TODO Auto-generated method stub
       System.out.println("顾客A 被通知电影更新了");
    }
}

 

 

 

package watchermodel;
 
public class CustomB extends Watcher {
    @Override
    public void update() {
       // TODO Auto-generated method stub
       System.out.println("顾客B 被通知电影更新了");
    }
}

 

 

具体的被观察者

package watchermodel;

import java.util.ArrayList;
import java.util.List;

public class MovieA implements Watched {
        List<Watcher> watcherList=new ArrayList<Watcher>();
    @Override
    public void addWatcher(Watcher watcher) {
        // TODO Auto-generated method stub
        watcherList.add(watcher);
        System.out.println("增加了一个观众");
    }

    @Override
    public void removeWatcher(Watcher watcher) {
        // TODO Auto-generated method stub
        watcherList.remove(watcher);
        System.out.println("删除了一个观众");
    }

    @Override
    public void noticeWatcher() {
        // TODO Auto-generated method stub
        for(Watcher w:watcherList){
            w.update();
        }
    }
}

 

 

测试:

package watchermodel;
 
public class testWatcher {
 
    public static void main(String[] args) {
       // TODO Auto-generated method stub
       CustomA customA=new CustomA();
       CustomB customB=new CustomB();
       MovieA movieA=new MovieA();
       movieA.addWatcher(customA);
       movieA.addWatcher(customB);
       movieA.noticeWatcher();
       movieA.removeWatcher(customA);
    }
}

 

使用的场景:

被观察的改变需要通知观察者,但是具体什么观察者,多少观察者不清楚

一个对象的改变需要另外多个

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式