文档章节

设计模式系列--Observer

rakshasa
 rakshasa
发布于 2014/12/27 15:53
字数 611
阅读 5
收藏 0

一.类图

 

二.意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。

三.适用性

a) 当一个抽象模型有两个方面其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用

b) 当对一个对象的改变需要同时改变其它对象而不知道具体有多少对象有待改变。

c) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之你不希望这些对象是紧密耦合的。

四.实例

乡村爱情第五部中大脑袋为大拿出了一个主意,当杨总来的时候保安拦住杨总,同时通知王大拿。这细节就不细说了,如果想看的上网看就行了。这是一个典型的Observer设计模式。

 

package explore.observer;

public interface Observer {
public void notice();
}

package explore.observer;
//Observer对象
public class GuardLeader implements Observer {
@Override
public void notice() {
System.out.println("王总,杨总来了!");
}
}

package explore.observer;
//Observer对象
public class GuardMember implements Observer {
@Override
public void notice() {
System.out.println("杨总来了...唠了十分钟...");
}
}

package explore.observer;

public interface Observable {
public void addObserver(Observer o);
public void delObserver(Observer o);
public void inform();
}

package explore.observer;

import java.util.ArrayList;
import java.util.List;

//observable对象
public class Gate implements Observable {
public List<Observer> guards = null;

public Gate() {
guards = new ArrayList<Observer>();
}

public void openTheGate(String person) {
if("杨总".equals(person)) {
inform();
}
System.out.println("欢迎杨总!");
}

@Override
public void addObserver(Observer o) {
guards.add(o);
}

@Override
public void delObserver(Observer o) {
guards.remove(o);
}

@Override
public void inform() {
for(Observer o : guards) {
o.notice();
}

}
}

package explore.observer;

public class Client {
public static void main(String[] args) {
GuardLeader leader = new GuardLeader();
GuardMember member = new GuardMember();
Gate gate = new Gate();
gate.addObserver(leader);
gate.addObserver(member);
gate.openTheGate("杨总");
}
}

 

这个Observer模式是自定义的代码实现的,同时JDK中给出了Observer的实现接口分别是ObservableObserver。这两个类的用法俺就不说了,大家试着读一下API吧。

 

五.AwtObserver模式

 

Java awt包中用Observer模式最多了,写过照面程序的都知道:我们对程序的每个操作都要有Observer类监听,否则不会产生我们想要的结果。

 

看一下Button类的源码:

 

public class Button extends Component implements Accessible {
... ...
public synchronized void addActionListener(ActionListener l) {
if (l == null) {
return;
}
actionListener = AWTEventMulticaster.add(actionListener, l);
newEventsOnly = true;
}

public synchronized void removeActionListener(ActionListener l) {
if (l == null) {
return;
}
actionListener = AWTEventMulticaster.remove(actionListener, l);
}

protected void processActionEvent(ActionEvent e) {
ActionListener listener = actionListener;
if (listener != null) {
listener.actionPerformed(e);
}
}





本文转载自:http://www.cnblogs.com/focusj/archive/2012/03/19/2406365.html

rakshasa
粉丝 34
博文 142
码字总数 16820
作品 0
昆明
高级程序员
私信 提问
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
154
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
169
0
设计模式17——Observer设计模式

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当...

小米米儿小
2014/01/26
71
0
Java 中的 GoF 设计模式(第一部分)

为了理解 GoF(Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人组)的设计模式原理和历史,我制作了一个 10 分钟的短视频。(作为 PluralSight 作者试录的) 视频:https...

王桥修道院副院长
2017/02/13
2.7K
3
设计模式(Swift) - 3.观察者模式、建造者模式

上一篇 设计模式(Swift) - 2.单例模式、备忘录模式和策略模式中讲了三种常见的设计模式. 单例模式: 限制了类的实例化,一个类只能实例化一个对象,所有对单例对象的引用都是指向了同一个对象....

Dariel
2018/07/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
6
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0
浅谈java过滤器Filter

一、简介 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml...

青衣霓裳
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部