设计模式之观察者模式

概述

观察者模式是一个使用频率非常高的设计模式。不过这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得他们的依赖性变小,甚至做到毫无依赖。它是一种定义对象间一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

使用场景

  • 关联行为场景,需要注意的是,关联是可拆分的,而不是“组合”关系。
  • 跨系统的消息交换场景,如消息队列,事件机制。
  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

具体实现

下面让我们简单模拟一下订阅过程。

public class Coder implements Observer{

    public Strung name;
    
    public Coder(String name){
        this.name=name;
    }
    
    @Override
    public void update(Observale o,Object arg){
    System.out.println("Hi,"+name+"有新任务啦,内容:"+arg);
    }
    
    @Override
    public void toString(){
    return "工程师"+name;
    }
}
public class Task extends Observable{

    public void postTask(String content){
    setChange();
    notifyObservers(content);
    }
}
public class Demo{

    public static void main(String[] args){
    
        Task task=new Task();
        Coder coder1=new Coder("coder1");
        Coder coder2=new Coder("coder2");
        Coder coder3=new Coder("coder3");
        task.addObserver(coder1);
        task.addObserver(coder2);
        task.addObserver(coder3);
        task.postTask("一周上线一个淘宝!!");
    }
}

输出结果如下:

Hi,coder1,有新任务啦,内容:一周上线一个淘宝!!
Hi,coder2,有新任务啦,内容:一周上线一个淘宝!!
Hi,coder3,有新任务啦,内容:一周上线一个淘宝!!

###总结
观察者模式主要的作用就是对象解耦,将观察者与被观察者完全隔离,只依赖于Observer和Observable抽象。例如Listview就是运用了Adapter和观察者模式使得它的可扩展性,灵活性非常强。并且耦合度非常低。
优点:

  • 观察者和被观察者之间是抽象耦合。
  • 建立一套触发机制。

缺点:

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
发布了89 篇原创文章 · 获赞 155 · 访问量 29万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览