博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Behavioral模式之Observer模式
阅读量:5846 次
发布时间:2019-06-18

本文共 2479 字,大约阅读时间需要 8 分钟。

1.意图

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

2.别名

依赖(dependents),公布-订阅(Publish-Subscribe)

3.动机

将一个系统切割成一系列相互协作的类。有一个常见的副作用:须要维护相关对象间的一致性。

我们不希望为了维持一致性而使得个类之间紧密耦合。因此这样减少了他们的可重用性。

4.适用性

下面情况使用ObServer模式:

- 当一个抽象模型有两个方面,当中一个方面依赖于还有一个方面。将这二者封装在独立的对象中以使它们能够各自独立的改变和复用。
- 当对一个对象的改变须要同一时候改变其他对象,而不知道详细有多少对象有待改变。

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

5.结构

包含这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承。学的时候应该 记得归纳,记得本文最開始的那个图。

观察者模式非常好理解,相似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,常常会看到RSS图标,就这的意思是。当你订阅了该文章。假设兴许有更新,会及时通知你。

事实上。简单来讲就一句话:当一个对象变化时,其他依赖该对象的对象都会收到通知,而且随着变化!对象之间是一种一对多的关系。

先来看看关系图:

Observer模式
我解释下这些类的作用:MySubject类就是我们的主对象。Observer1和Observer2是依赖于MySubject的对象。当MySubject变化时。Observer1和Observer2必定变化。

AbstractSubject类中定义着须要监控的对象列表。能够对其进行改动:添加或删除被监控对象。且当MySubject变化时。负责通知在列表内存在的对象。

我们看实现代码:

6.代码演示样例

实现代码:

一个Observer接口:

public interface Observer {    public void update();}

两个实现类::

public class Observer1 implements Observer {
@Override public void update() { System.out.println("observer1 has received!"); }}public class Observer2 implements Observer {
@Override public void update() { System.out.println("observer2 has received!"); }}

Subject接口及实现类::

public interface Subject {
/*添加观察者*/ public void add(Observer observer); /*删除观察者*/ public void del(Observer observer); /*通知全部的观察者*/ public void notifyObservers(); /*自身的操作*/ public void operation();}public abstract class AbstractSubject implements Subject {
private Vector
vector = new Vector
(); @Override public void add(Observer observer) { vector.add(observer); } @Override public void del(Observer observer) { vector.remove(observer); } @Override public void notifyObservers() { Enumeration
enumo = vector.elements(); while(enumo.hasMoreElements()){ enumo.nextElement().update(); } }}public class MySubject extends AbstractSubject {
@Override public void operation() { System.out.println("update self!"); notifyObservers(); }}

測试类:

public class ObserverTest {    public static void main(String[] args) {        Subject sub = new MySubject();        sub.add(new Observer1());        sub.add(new Observer2());        sub.operation();    }}

输出:

update self!
observer1 has received!
observer2 has received!。

7.相关模式

引用:

转载于:https://www.cnblogs.com/gavanwanggw/p/7122574.html

你可能感兴趣的文章
跟随我在oracle学习php(8)
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
Kotlin的语法糖(一)基础篇
查看>>
亚信安全参加第六届全国等保技术大会 态势感知助力“等保2.0”落地
查看>>
大数据公司Palantir融得7亿美元 曾追踪拉登
查看>>
建立备份策略的重要性
查看>>
发力IoT领域 Marvell注重生态系统发展
查看>>
你应该知道的 RPC 原理
查看>>
Ubuntu安装词典
查看>>
Spring解析
查看>>
python中str和repr区别
查看>>
数据挖掘-同比与环比
查看>>
RedHat6 管理应用服务【11】
查看>>
stm32F10x复习-1
查看>>
[转] vue异步处理错误
查看>>
CSS 3D动画概述菜鸟级解读之一
查看>>
kindeditor.net应用
查看>>
函数preg_replace()与str_replace()
查看>>
HTTP工具CURL的使用简介
查看>>
P2P的远程协助系统技术分析[转]
查看>>