观察者模式(Observer模式)
目录
一、模式的定义与特点
二、观察者模式的使用场景:
注意事项:
三、模式的结构与实现
模式的实现
前言:
在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。
在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来实现就非常方便。
一、模式的定义与特点
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
它的主要优点如下:
1、降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
2、目标与观察者之间建立了一套触发机制。
它的主要缺点如下:
① 如果一个被观察者对象 有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
②如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
③ 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
二、观察者模式的使用场景:
1) 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
2) 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
3) 一个对象必须通知其他对象,而并不知道这些对象是谁。
4) 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意事项:
① JAVA 中已经有了对观察者模式的支持类。
② 避免循环引用。
③ 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
三、模式的结构与实现
实现观察者模式时要注意具体目标对象 和具体观察者对象 之间不能 直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。 观察者模式的主要角色如下。
模式的实现
观察者模式的实现代码如下:
package net.biancheng.c.observer;
import java.util.*;
public class ObserverPattern {public static void main(String[] args) {Subject subject = new ConcreteSubject();Observer obs1 = new ConcreteObserver1();Observer obs2 = new ConcreteObserver2();subject.add(obs1);subject.add(obs2);subject.notifyObserver();}
}
//抽象目标
abstract class Subject {protected List<Observer> observers = new ArrayList<Observer>();//增加观察者方法public void add(Observer observer) {observers.add(observer);}//删除观察者方法public void remove(Observer observer) {observers.remove(observer);}public abstract void notifyObserver(); //通知观察者方法
}
//具体目标
class ConcreteSubject extends Subject {public void notifyObserver() {System.out.println("具体目标发生改变...");System.out.println("--------------");for (Object obs : observers) {((Observer) obs).response();}}
}
//抽象观察者
interface Observer {void response(); //反应
}
//具体观察者1
class ConcreteObserver1 implements Observer {public void response() {System.out.println("具体观察者1作出反应!");}
}
//具体观察者1
class ConcreteObserver2 implements Observer {public void response() {System.out.println("具体观察者2作出反应!");}
}
/*
程序运行结果如下:
具体目标发生改变...
--------------
具体观察者1作出反应!
具体观察者2作出反应!
*/
观察者模式(Observer模式)相关推荐
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- java observer模式_Java观察者模式(Observer)详解及应用
Java观察者模式(Observer)详解及应用 (2011-12-15 14:03:30) 标签: 杂谈 Java观察者模式(Observer)详解及应用 由于网站带有弱sns功能,因此需要设计关注 ...
- 设计模式之观察者模式(Observer)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式:观察者模式--Observer
一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- 设计模式-Observer模式
目录 角色组成 抽象主题(Subject) 具体主题(Concrete Subject) 抽象观察者(Observer) 具体观察者(Concrete Observer) 具体实现 总结 观察者模式( ...
- Observer 模式在eHR中的应用
接触模式应该是在大三的时候,那时候感觉是模式让我真正的认识到了OO,现在毕业了,也工作有半年了,终于体会到了"商业特色的软件开发"了,根本就没有多余的时间去考虑运用什么模式.怎样使 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 设计模式--观察者(Observer)模式
模式定义 定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新 类图 应用场景 当更改一个对象的状态可能需要更改其他对象,并且实际 ...
- 观察者模式(Observer) 简介
一, 观察者模式(Observer) 的定义 观察者模式: 定义了一种 1对多 的依赖关系, 让多个观察者对象同时监听1个主题对象. 这个主题对象在状态发生变化时, 会通知所有的观察者对象, 使它 ...
最新文章
- 使用phpStudy运行伊人集项目
- exchange2003防垃圾邮件设置
- python os 获取当前路径的绝对路径的上层目录_os 模块常用函数
- 学python的好处-python有什么优点
- 实践自定义UI—RLF...(RelativeLayout LinearLayout FrameLayout....)
- 判断用户是否存在再进行新增_4招教你判断抖音真假粉,快速分辨抖音号的真实度!...
- php swoole实现定时任务,Swoole实现任务定时自动化调度详解,来学习下
- 脚本监控网络状态,输出日志并归档(V2)
- 使用代码生成具有层级结构的IBASE
- 2018软工实践第六次作业-团队选题报告
- 递归函数合式分解python_python(22)- 递归和函数式编程
- 转:LoadRunner检查点使用小结
- win7可以运行python_win7安装python开发环境,运行python
- 灭霸级——如何选择最适合你的Linux发行版
- 认证 (authentication) 和授权 (authorization) 的区别.md
- python时间复杂度和空间复杂度是指,时间复杂度与空间复杂度
- java基于springboot家庭水电燃气网上交费系统
- 社保包括哪些保险?社保和五险一金有什么区别?
- 魔兽世界服务器名称修改,魔兽世界怀旧服新增6组服务器 新服务器名称一览
- 从键盘输入两个数作为除数和被除数。要求程序中捕获NumberFormatException 异常和ArithmeticException 异常, 而且无论在哪种情况下,“程序执行结束”这句话都会在控制
热门文章
- 比尔·盖茨给年轻人的18句忠告
- Videos Understanding Dataset
- 如何在Meego上网本系统安装Dropbox等应用
- oracle 报错2PC,关于ORACLE的ora-12505报错以及连接问题的解决及相关资料 (2)
- wepy build --watch报错 ERR! Parse WePY config failed. Are you trying to use 解决
- html css样式出不来与背景图片出不来的解决办法
- KVM重启网络报错-1
- SEO(百度)快排有用吗?SEO百度快排原理讲解。
- 2021年电工(中级)考试技巧及电工(中级)试题及答案
- 怎么发表医学职称论文