Swing中惯用模式之观察者

#定义

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

# 关键角色:

1.主题(Subject)

  抽象主题以及具体的主题

2.观察者(Observer)

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


图片发自简书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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 订阅报纸的过程## 来考虑实际生活中订阅报纸的过程,这里简单总结了一下,订阅报纸的基本流程...
    七寸知架构阅读 4,684评论 5 57
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,951评论 19 139
  • 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通...
    扈扈哈嘿阅读 1,348评论 0 12
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,091评论 0 4
  • 这星期一直在看度阴山著作,知行合一王阳明心法,从书中我了解到王阳明心法并不像外界看起来如此困难,它就围绕一个点良知...
    陈脑院阅读 557评论 4 2