1、什么是观察者模式?
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,让他们自动更新自己。
举个例子:在java GUI程序中,一个按钮有多个监听器,当这个按钮被点击时,即上面所说的主题对象状态发生变化,多个监听器自动得到调用。
2、观察者模式的组成:可以概括为两个抽象和两个具体。
-
抽象主题(Subject)角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
-
抽象观察者(Observer)角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
-
具体主题角(ConcreteSubject)色:在具体主题角色内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常由一个子类来实现。
-
具体观察者(ConcreteObserver)角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类来实现。
上面说的还是很抽象,还是用代码来说话吧!
代码如下:
//抽象主题角色:
//抽象主题角色
public interface Subject
{
//注册观察者对象
public void addWatcher(Observer watcher);
//删除观察者对象
public void removeWatcher(Observer watcher);
//通知所有的观察者对象
public void notifyWatchers(String str);
}
//具体主题角色:
//具体主题角色
public class ConcreteSubject implements Subject
{
//把所有对观察者对象的引用保存在一个集合中
private List<Observer> list = new ArrayList<Observer>();
@Override
public void addWatcher(Observer watcher)
{
list.add(watcher);
}
@Override
public void removeWatcher(Observer watcher)
{
list.remove(watcher);
}
@Override
public void notifyWatchers(String str)
{
for(Observer watcher : list)
{
watcher.update(str);
}
}
}
//抽象观察者角色:
//抽象观察者角色
public interface Observer
{
public void update(String str);
}
//具体观察者对象:
//具体观察者对象
public class ConcreteObserver implements Observer
{
@Override
public void update(String str)
{
System.out.println(str);
}
}
//测试类:
public class TestObserver
{
public static void main(String[] args)
{
//相当于GUI中一个按钮
Subject watched = new ConcreteSubject();
//相当于按钮的事件监听器
Observer watcher1 = new ConcreteObserver();
Observer watcher2 = new ConcreteObserver();
Observer watcher3 = new ConcreteObserver();
//将监听器注册到主题角色中
watched.addWatcher(watcher1);
watched.addWatcher(watcher2);
watched.addWatcher(watcher3);
//在单击按钮后,触发了事件
watched.notifyWatchers("hello");
System.out.println("-----------");
watched.removeWatcher(watcher1);
watched.notifyWatchers("world");
}
}
3、总结:java在GUI编程中大量使用了观察者模式,在jdk中也提供了对观察者模式的支持,它们在java.util包中的Obserable类和Observer接口,其中的实现思路与上面的代码大体相同,所以在理解了上面简单代码的基础上,再去研究jdk对观察者模式所提供的源码就不是什么难事了。
分享到:
相关推荐
基于photoshop网络课程网站设计初探-网站设计-设计.pdf
设计模式初探 开发环境 AndroidStudio java8 实现原理 采用单一职责 将图片缓存 及图片加载拆分, 采用里氏替换 将图片三级缓存抽取为接口,子类可自由实现 采用接口隔离原则, 将读写流 实现的Closeable 接口 统一...
观察者模式( Observer ) 迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( ...
冷库消防安全设计初探-安全管理-行业安全-消防安全.docx
Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
c语言程序设计教材建设初探-程序设计-设计.pdf
哈佛大学数据科学课程教学初探-最新教育文档.pdf哈佛大学数据科学课程教学初探-最新教育文档.pdf哈佛大学数据科学课程教学初探-最新教育文档.pdf哈佛大学数据科学课程教学初探-最新教育文档.pdf哈佛大学数据科学课程...
《基础西班牙语》课堂教学模式改革初探--
本科毕业设计--动物园网站设计初探.doc
我国电子商务物流配送模式初探-论文.doc
第1章-计算机基础 第2章-Java初探 第3章-Java程序基础 第5章-方法和数组 第8章-多线程。。。。。
制造企业应用电子商务模式初探-毕业论文.doc
制造企业应用电子商务模式初探-毕设论文.doc
基于微信雨课堂的混合式教学模式初探--以《单片机原理与应用》课程为例.pdf
毕业设计论文-我国电子商务物流配送模式初探.doc
新时期小学英语phonic教学模式初探-论文.zip
信息化环境下和谐人机会计模式初探-1.docx
她”消费时代的咸阳养生旅游产品设计初探-论文.zip