安居多伦多
  • 多市生活
    • 多市生活
    • 加国税务
    • 旅游度假
    • 生活安全
    • 行车安全
    • 窍门集锦
  • 多市书苑
    • 热门
    • 小说
    • 教育
  • 家居信息
    • 家居信息
    • 房屋保养
    • 房屋贷款
    • 房屋租赁
    • 房屋建筑
    • 房前屋后
    • 家居风水
  • 健康保健
    • 健康保健
    • 饮食起居
    • 食品安全
    • 健身锻炼
  • 书苑账户
    • 书苑登入
    • 书苑注册
    • 忘记书苑密码
    • 书苑账户信息
    • 关于我们
    • 联系我们
    • 隐私政策
多伦多书苑
在线书籍:随时阅读,随身听书。
所有书籍 | 人文 | 人物 | 人生 | 健康 | 儿童 | 医学 | 历史 | 历史 | 古典 | 哲学宗教 | 商业 | 外国 | 寓言 | 小说 | 教育 | 风水 | 管理 | 语言 |
为使本公益资源网站能继续提供免费阅读,请勿屏蔽广告。谢谢!报告弹出广告被滥用。
  1. 安居多伦多
  2. 网上书苑
  3. IT
  4. 设计模式之禅

设计模式之禅

2021-08-04 1人点赞 0条评论
点赞
x
语速1.0: 2.0
进度0:

上一页   |   返回目录   |   下一页

本书仅供会员,测试期间不限,赶快看。

22.2 观察者模式的定义

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式,其定义如下:

Define a one-to-many dependency between objects so that when one object changes state,all itsdependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)观察者模式的通用类图,如图22-5所示。

图22-5 观察者模式通用类图

图22-5 观察者模式通用类图

我们先来解释一下观察者模式的几个角色名称:

● Subject被观察者

定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。

● Observer观察者

观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。

● ConcreteSubject具体的被观察者定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

● ConcreteObserver具体的观察者每个观察在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑。

各个名词介绍完毕,我们来看看各自的通用代码,先看被观察者角色,如代码清单22-15所示。

代码清单22-15 被观察者

public abstract class Subject {
//定义一个观察者数组
private Vector obsVector = new Vector();
//增加一个观察者
public void addObserver(Observer o) {
this.obsVector.add(o);
}
//删除一个观察者
public void delObserver(Observer o) {
this.obsVector.remove(o);
}
//通知所有观察者
public void notifyObservers() {
for(Observer o:this.obsVector) {
o.update();
}
}
}

被观察者的职责非常简单,就是定义谁能够观察,谁不能观察,程序中使用ArrayList和Vector没有太大的差别,ArrayList是线程异步,不安全;Vector是线程同步,安全——就这点区别。我们再来看具体的被观察者,如代码清单22-16所示。

代码清单22-16 具体被观察者

public class ConcreteSubject extends Subject {
//具体的业务
public void doSomething() {
/** do something
*/super.notifyObservers();
}
}

我们现在看到的是一个纯净的观察者,在具体项目中该类有很多的变种,在22.4一节中介绍。

我们再来看观察者角色,如代码清单22-17所示。

代码清单22-17 观察者

public interface Observer {
//更新方法
public void update();
}

观察者一般是一个接口,每一个实现该接口的实现类都是具体观察者,如代码清单22-18所示。

代码清单22-18 具体观察者

public class ConcreteObserver implements Observer {
//实现更新方法
public void update() {
System.out.println("接收到信息,并进行处理!");
}
}

那其他模块是怎么来调用的呢?我们编写一个Client类来描述,如代码清单22-19所示。

代码清单22-19 场景类

public class Client {
public static void main(String[] args) {
//创建一个被观察者

ConcreteSubject subject = new ConcreteSubject();
//定义一个观察者

Observer obs= new ConcreteObserver();
//观察者观察被观察者

subject.addObserver(obs);
//观察者开始活动了

subject.doSomething();
}
}

上一页   |   返回目录   |   下一页

类似书籍

人月神话
人月神话
设计冲刺:谷歌风投如何5天完成产品迭代
设计冲刺:谷歌风投如何5天完成产品迭代
数学之美和浪潮之巅
数学之美和浪潮之巅
SEO教程:搜索引擎优化入门与进阶(第3版)
SEO教程:搜索引擎优化入门与进阶(第3版)
Author:

标签: 暂无
最后更新:2021-08-04
< 上一篇
下一篇 >

本书评论

取消回复

©2021 安居多伦多 - 版权所有

本站由 好事来 Hostlike.com 提供技术支持。