#定义
观察者模式又叫 发布-订阅 模式,定义的两个对象之间是一种一对多的强依赖关系,当一个对象的状态发生改变,所有依赖它的对象
# 关键角色:
1.主题(Subject)
抽象主题以及具体的主题
2.观察者(Observer)
抽象观察者以及具体观察者
##抽象理解:我们订阅简书中喜欢的栏目,一旦这个栏目有通知,我们订阅用户会收到通知,我们作为具体观察者 而订阅栏目作为具体主题
swing的按钮监听,通过事件委托机制,进行分发,来处理不同的事件,下面举一个例子
```
package org2.main.swing;
import javax.swing.*;
/**
* Created by Administrator on 2017/4/5
* swing驱动事件
*/
public class MainFrame {
//定义个容器变量
JFrame f = null;
//定义个按钮变量
JButton btn = null;
public MainFrame() {
//创建容器
f = new JFrame( "事件模型" );
//创建按钮
btn = new JButton( "按钮" );
//把按钮添加到容器中
f.add( btn );
//设置容器大小
f.setSize( 300, 200 );
//把容器设置为 可见
f.setVisible( true );
//给按钮添加事件处理
//在btn上注册一个监听器
//(btn其实就是具体的主题对象)
//(而监听器就是具体的观察者)
//当点击按钮时(其实也就是主题对象发生了改变),就会触发监听器事件(观察者更新了)
btn.addActionListener( new MyListener() );
}
//main方法
public static void main( String[] args ) {
new MainFrame();
}
}
```
下面是事件具体处理
```
package org2.main.swing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Created by Administrator on 2017/4/5
* 定义一个监听器(具体观察者)
*/
public class MyListener implements ActionListener {
//该方法类似于观察中的update方法
@Override
public void actionPerformed( ActionEvent e ) {
System.out.println( "按钮被点击,执行一些业务逻辑操作" );
}
}
```
#总结
总的来说,观察者模式所做的工作其实就是在解除耦合。让耦合双方都依赖抽象,
而不是具体。从而使得各自的变化都不影响其他一方。这也符合了依赖倒置原则。
#使用原则
1.当一个对象的改变需要同时改变其他对象时。
2.一个对象不知道它的改变会影响多少个类的改变。
3.当有一个抽象模型有两个方面,一面依赖另一面。这时观察者模式可以很好地
将两者封装在独立的对象使它们各自独立改变和复用。
最后:重写组件时可能运用到观察者模式,在数据处理,数据更新,通知其他消息组件时,都可以运用到!
#缺点
观察者设计模式中需要每个观察者重写通知方法,但是实际运用中,不可能能每个观察者都有通知方法,那么怎么解决这个问题呢,那就是运用消息队列来处理,拥有消息通知方法的观察者发布消息到队列中,实际主题只需要设计响应的方法从消息队列中取出消息数据即可!提供实际类
参考
java.util.concurrent.BlockingQueue;
java.util.concurrent.LinkedBlockingQueue;