观察者模式
来源:互联网 发布:精英特速读软件 编辑:程序博客网 时间:2024/06/07 21:07
定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更
被观察者:从类图中可以看到,类中有一个用来存放观察者对象的Vector容器(之所以使用Vector而不使用List,是因为多线程操作时,Vector在是安全的,而List则是不安全的),这个Vector容器是被观察者类的核心,另外还有三个方法:attach方法是向这个容器中添加观察者对象;detach方法是从容器中移除观察者对象;notify方法是依次调用观察者对象的对应方法。这个角色可以是接口,也可以是抽象类或者具体的类,因为很多情况下会与其他的模式混用,所以使用抽象类的情况比较多。
观察者:观察者角色一般是一个接口,它只有一个update方法,在被观察者状态发生变化时,这个方法就会被触发调用。
具体的被观察者:使用这个角色是为了便于扩展,可以在此角色中定义具体的业务逻辑。
具体的观察者:观察者接口的具体实现,在这个角色中,将定义被观察者对象状态发生变化时所要处理的逻辑。
观察者模式也叫发布/订阅模型
abstract class Subject { private Vector<Observer> obs = new Vector<Observer>(); public void addObserver(Observer obs){ this.obs.add(obs); } public void delObserver(Observer obs){ this.obs.remove(obs); } protected void notifyObserver(){ for(Observer o: obs){ o.update(); } } public abstract void doSomething();}//被观察者class ConcreteSubject extends Subject { public void doSomething(){ System.out.println("被观察者事件反生"); super.notifyObserver(); }}//观察者interface Observer { public void update();}class ConcreteObserver1 implements Observer { public void update() { System.out.println("观察者1收到信息,并进行处理。"); }}class ConcreteObserver2 implements Observer { public void update() { System.out.println("观察者2收到信息,并进行处理。"); }}public class Client { public static void main(String[] args){ Subject sub = new ConcreteSubject(); sub.addObserver(new ConcreteObserver1()); //添加观察者1 sub.addObserver(new ConcreteObserver2()); //添加观察者2 sub.doSomething(); }}
优点:
观察者和被观察者之间是抽象耦合。使得观察者和被观察者都容易扩展
建立一套触发机制
缺点:
需要考虑开发效率和运行效率,以及后期的调试
多级触发时,观察者卡壳,效率问题更甚
应用
关联行为场景。关联行为需要可拆分
事件多级触发
跨系统的消息交换场景,如消息队列的处理机制
阅读全文
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 【Spark2.0源码学习】-8.SparkContext与Application介绍
- hdu 6170 Two strings
- 算法提高 ADV-78 最长单词
- Layui的学习思路
- Android Studio插件安装
- 观察者模式
- 爬虫学习(四)mongoDB与Scrapy---优化豆瓣电影实例
- 算法提高 ADV-79 时间转换
- error: src refspec master does not match any. error: failed to push some refs to xxx
- 第四周编程题_实现一个表达MP3的媒体类型
- 算法提高 AdV-80 选最大数
- IT 技术书籍
- 算法提高 ADV-81 数的运算
- Tomcat端口号的配置