一、模式解析

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

  观察者模式又叫订阅发布模式,从模式理解上来讲,订阅发布模式更好的体现了此模式的含义,因为在我的理解中,观察者和被观察者的关系是,观察者应该时时关注被观察者的动向,如果被观察者发生了变化,那么观察者应该发生对应的关系,比如看球,每个观众都在观察场上局势,如果球进了,有些观众或鼓掌,有些会欢呼,甚至有些会luoben。。这时候并不需要人告诉他们球进了。相反从订阅发布角度来讲,订阅者提供自己的信息给发布者,发布者向这些订阅者发布信息。最与此接近的实际例子为:订阅报纸后,每天邮递员会将报纸投递给订阅者。

二、模式代码

1、抽象观察者/抽象订阅者

package observer.patten;
/**
* 监听者,实现update方法,update方法会在被监听者变化是主动调用
* @author zjl
* @time 2016-1-25
*
*/
public interface Observer {
public void update();
}

2、观察者/订阅者

package observer.patten;

public class ConcreteObserver implements Observer {

    @Override
public void update() {
System.out.println("我是监听者,收到了被监听者的变化");
} }

3、抽象被观察者/抽象发布者

package observer.patten;

import java.util.ArrayList;
import java.util.List; public abstract class Obserable {
List<Observer> list=new ArrayList<Observer>();//使用list保存被观察者集合
public void attach(Observer observer){
list.add(observer);
}
public void detach(Observer observer){
list.remove(observer);
}
//notify似乎与jdk底部方法冲突,不能重写
public void notify1(){
for(Observer observer:list){
observer.update();
}
}
}

4、被观察者/发布者

package observer.patten;

public class ConcreteObserable extends Obserable {
public void doSomething(){
System.out.println("被观察者做了一些事情");
this.notify1();
}
}

5、客户端代码

package observer.patten;

public class Client {
public static void main(String[] args) {
ConcreteObserable obserable=new ConcreteObserable();
Observer observer=new ConcreteObserver();
obserable.attach(observer);
obserable.doSomething();
}
}

6、执行结果

被观察者做了一些事情
我是监听者,收到了被监听者的变化

三、应用场景

对于观察者模式很容易想到的就是界面设计中对于各种事件的应用,比如点击按钮后可以执行一些方法或者事件,我们简单看下jdk底层,确实采用观察者模式进行实现,此处简单模拟下原理

四、场景代码

1、定义抽象的按钮类,在类里保存事件列表

package observer.example;

import java.util.ArrayList;
import java.util.List; public abstract class AbstractButton {
public List<ActionListener> list=new ArrayList<ActionListener>();
public void addActionListener(ActionListener actionListener){
if(!list.contains(actionListener)){
list.add(actionListener);
}
}
public void removeActionListener(ActionListener actionListener){
if(list.contains(actionListener)){
list.remove(actionListener);
}
} public void fireActionPerformed(){
for(ActionListener actionListener:list){
actionListener.actionPerformed();
}
} }

2、定义按钮

package observer.example;

public class Button extends AbstractButton {

    public void click(){
this.fireActionPerformed();
}
}

3、定义点击事件的接口

package observer.example;

public interface ActionListener {
public void actionPerformed();
}

4、定义按钮事件

package observer.example;

public class ClickActionListener1 implements ActionListener {

    @Override
public void actionPerformed() {
System.out.println("按钮被点击了,打开新的页面");
} }

5、客户端代码

package observer.example;

public class Client {
public static void main(String[] args) {
Button button=new Button();
button.addActionListener(new ClickActionListener1());
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed() {
System.out.println("原始页面关闭");
}
});
button.click();
}
}

6、结果

按钮被点击了,打开新的页面
原始页面关闭

五、一点分析

1、如实例所言,对于监听者的创建,可以采取内部类形式,不过这样有两个坏处,1)无法获取添加的监听者指针,也就无法进行删除操作,2)内部类很容易造成java的代码的混乱,所以不建议使用。

2、如实例中,想要给一个按钮不仅添加点击事件,同时添加焦点事件等,jdk给出的实例为分别编写addFocusListener,addActionListener 等方法来分别事件各种事件的添加,但是我们对比js的时候,发现js其实只有一个方法,使用addEventLister(eventType,fn)就可以完成所有事件添加,所以下章重点讨论java的事件委托。

[工作中的设计模式]观察者模式observer的更多相关文章

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. [Head First设计模式]山西面馆中的设计模式——观察者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

  3. C#设计模式——观察者模式(Observer Pattern)1

    一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...

  4. C#设计模式——观察者模式(Observer Pattern)

    一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...

  5. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  6. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  7. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  8. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

  9. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

随机推荐

  1. 【leetcode】 Palindrome Partitioniong (middle) (*^__^*)

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  2. 【leetcode】Binary Tree Preorder Traversal (middle)★

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  3. win8访问win7中的共享文件夹 映射网络驱动器

    同一个局域网内,配置好了一台win7(假设计算机名为A)的共享文件夹,设置方法可以参考http://www.doudouxitong.com/guzhang/xitongjiqiao/2014/082 ...

  4. 转载_虚拟机下LInux(终端)配置网络的方法

    出自: http://www.360doc.com/content/14/1027/11/17496895_420258403.shtml 对文章的重点进行剪贴,方便查看. 这几天在虚拟机vmware ...

  5. 数据库IO简介

    IO有四种类型:连续读,随机读,随机写和连续写,连续读写的IO size通常比较大(128KB-1MB),主要衡量吞吐量,而随机读写的IO size比较小(小于8KB),主要衡量IOPS和响应时间.数 ...

  6. Redis不同数据类型的的数据结构实现

    我们知道Redis支持五种数据类型, 分别是字符串.哈希表(map).列表(list).集合(set)和有序集合,和Java的集合框架类似,不同数据类型的数据结构实也是不一样的. >>Re ...

  7. 【JAVA多线程中使用的方法】

    一.sleep和wait的区别. 1.wait可以指定时间,也可以不指定. 而sleep必须制定. 2.在同步的时候,对于CPU的执行权和以及锁的处理不同. wait:释放执行权,释放锁. sleep ...

  8. mysql 如何设置自动增长序列 sequence(一)

    背景:由于项目需要,必须用mysql设置主键自增长,而且想用字符串的.经过上网查找并且实验,终于做出了一套方案.现在就共享给大家! 解决思路:由于mysql不带sequence,所以要手写的,创建一张 ...

  9. C与C++之间相互调用

    1.导出C函数以用于C或C++的项目 如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言.如果是从C++语言模块使用,则 ...

  10. 声明replicated属性之后我编译不通过的问题