Swing中惯用模式之观察者

#定义

观察者模式又叫 发布-订阅 模式,定义的两个对象之间是一种一对多的强依赖关系,当一个对象的状态发生改变,所有依赖它的对象

# 关键角色:

1.主题(Subject)

  抽象主题以及具体的主题

2.观察者(Observer)

  抽象观察者以及具体观察者


Swing中惯用模式之观察者_第1张图片
图片发自App

##抽象理解:我们订阅中喜欢的栏目,一旦这个栏目有通知,我们订阅用户会收到通知,我们作为具体观察者 而订阅栏目作为具体主题

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;

你可能感兴趣的:(Swing中惯用模式之观察者)