观察者模式

发布时间: 更新时间: 总字数:1186 阅读时间:3m 作者: IP上海 分享 网址

Define a one-to-many dependency between objects so that when one objects changes state, all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)

观察者模式介绍

观察者,也被称作依赖或者发布订阅,是在项目中经常用到处理事件的一种模式。观察者的通用类图如下:

observer

常见的以下都是观察者模式的实现:

  • Observer
  • Listener
  • Hook
  • Callback

观察者模式分析

优点:

  • 支持广播通信。
  • 目标和观察者之间抽象耦合。

缺点:

  • 因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。
  • 然后又是效率问题了,开发效率以及运行效率方面都有可能存在问题,一个被观察者,多个观察者,开发调试比较复杂,而且一个观察者卡壳,其它观察者也会被影响。
  • 另外多级触发的效率也需要考虑到。

观察者模式之实现

Golang

Java

public interface Obeservable{
    //增加观察者
    public void addObserver(Observer observer);
    //删除观察者
    public void deleteObserver(Observer observer);
    //发生改变通知观察者
    public void notifyObservers(String context);
}

这个是通用的观察者接口,所有的观察者都可以实现这个接口,接下来是小贤的接口:

public class ZengXiaoXian implements IZengXiaoXian,Obserable{
    //定义动态数组存放不同媒体的狗仔队
    private ArrayList<Observer> observerList = new ArrayList<>();
    //增加观察者
    public void addObserver(Observer observer){
        this.observerList.add(observer);
    }
    //删除观察者
    public void deleteObserver(Observer observer){
        this.observerList.remove(observer);
    }
    //发生改变通知观察者
    public void notifyObservers(String context){
        for (Observer observer : observerList ) {
            observer.update(context);
        }
    }
    //吃饭
    public void eat(){
        System.out.println("曾小贤要吃饭了");
        this.notifyObservers("曾小贤要吃饭了");
    }
    //睡觉
    public void sleep(){
        System.out.println("曾小贤要睡觉了");
        this.notifyObservers("曾小贤要睡觉了");
    }
    //玩
    public void play(){
        System.out.println("曾小贤要玩耍了");
        this.notifyObservers("曾小贤要玩耍了");
    }
}

被观察者已经实现了,然后是观察者的实现,首先依然是观察者的接口:

public interface Observer{
    //发现被观察的人有动静,就开始准备写稿子,整头条什么的
    public void update(String context);
}

然后就是狗仔队的实现了,狗仔队一号出动:

public class Paparazzo1 implements Observer{
    //狗仔队一号一旦发现有什么爆料,就告诉老板
    public void update(String str){
        System.out.println("观察到曾小贤和张子萱拥吻,开始汇报");
        this.reportToXX(str);
    }
    //汇报给XX媒体
    private void reportToXX(String context){
        System.out.println("老大,我看到"+context);
    }
}

如果你还想要其它狗仔队请自行实现Paparazzo2、3等等等等,那么我们用一个场景类来实现当时的现场情况:

public class Client{
    public static void main(String[] args) {
        //出来一个狗仔队
        Observer paparazzo = new Paparazzo();

        //曾小贤出场
        ZengXiaoXian zengxiaoxian = new ZengXiaoXian();
        zengxiaoxian.addObserver(paparazzo);

        //看看曾小贤在干嘛
        zengxiaoxian.eat();
        zengxiaoxian.play();
        zengxiaoxian.sleep();
    }
}

观察者模式之应用场景

  • 当一个抽象模型有两个方面,其中一个依赖于另一个方面。
  • 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数