设计模式之——观察者模式
设计模式:
前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。
正确使用设计模式具有以下优点:
- 可以提高程序员的思维能力、编程能力和设计能力。
- 使程序设计更加标准化、代码编制更加I程化,使软件开发效率大大提高,从而缩短软件的开发周期。
- 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
介绍:
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
使用场景:
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
- 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
- 一个对象必须通知其他对象,而并不知道这些对象是谁。
- 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
演示实例
微信公众号给 订阅微信公众号的用户推送文章,推送的必要前提是:用户订阅公众号, 公众号需要推送文章,用户接收公众号的文章推送。公众号:被观察者、用户:观察者
定义观察者和被观察者接口
/*** 抽象被观察者*/
public interface Observable {//添加观察者void add(Observer observer);//移除观察者void remove(Observer observer);//通知观察者消息已经发出void nofityObservers();
}
/*** 抽象观察者*/
public interface Observer {/*** 当被观察者 发出消息的时候,这个方法接收消息*/void update(Object msg);
}
创建被观察者实例,即微信公众号
import java.util.ArrayList;
import java.util.List;/*** 具体的被观察者,用微信公众号进行模拟*/
public class WechatServer implements Observable{//观察者清单private static List<Observer> list = new ArrayList<>();//发送给用户的消息private String message;//消息发布public void pushMessage(String message){this.message = message;System.out.println("更新了消息:"+message);//通知所有订阅者更新nofityObservers();}@Overridepublic void add(Observer observer) {list.add(observer);}@Overridepublic void remove(Observer observer) {list.remove(observer);}@Overridepublic void nofityObservers() {for (Observer observer:list) {observer.update(message);}}
}
创建观察者实例,即用户
public class User implements Observer{private String name;private String message;public User(String name) {this.name = name;}@Overridepublic void update(Object msg) {this.message = (String) msg;read();}void read(){System.out.println(this.name+"\t收到推送消息\t"+this.message);}
}
测试类,用于测试观察者模式代码
public class TestMain {public static void main(String[] args) {//创建一个微信公众号(被观察者)Observable observable = new WechatServer();//创建用户(观察者)Observer jack = new User("jack");Observer jerry = new User("jerry");Observer merry = new User("merry");Observer sidy = new User("sidy");//用户订阅公众号(观察者绑定被观察者)observable.add(jack);observable.add(jerry);observable.add(merry);observable.add(sidy);//公众号更新消息((WechatServer)observable).pushMessage("一期新的更新");}
}
测试输出的结果
更新了消息:一期新的更新
jack 收到推送消息 一期新的更新
jerry 收到推送消息 一期新的更新
merry 收到推送消息 一期新的更新
sidy 收到推送消息 一期新的更新Process finished with exit code 0
设计模式之——观察者模式相关推荐
- 设计模式:观察者模式--Observer
一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...
- java 观察者模式_图解Java设计模式之观察者模式
图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...
- 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?
前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...
- java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解
Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...
- 设计模式 C++观察者模式
无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...
- 学习《图说设计模式》观察者模式
图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...
- 设计模式之观察者模式——猫抓老鼠2
设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...
- 设计模式之观察者模式——猫抓老鼠1
设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...
- 设计模式学习--观察者模式(Observer Pattern)
设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热! 下午15:28 设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...
- 「设计模式(二) - 观察者模式」
「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...
最新文章
- LoadRunner之二“集合点”
- java中Array和ArrayList区别
- 图灵近期新书精彩不断,让你应接不暇!
- 简单的ALV显示例子
- PHP 如何得到当前页面中所有已定义的变量和常量
- 循环嵌套-[扩展]print函数的结尾处理
- Linux防火墙iptables基础详解
- Spring 3 MVC深入研究
- TCMalloc内存分配器如何减少内存碎片?
- 2016年高通以50%的收益份额领跑基带芯片市场
- 关于大数据和互联网的一点想法
- 00套经典机械结构设计非标自动化SW机构3D图纸solidWorks模型库
- 【CV】细粒度图像分割 (FGIS)
- [转] 张凌 ARM体系架构
- [渝粤教育] 中国地质大学 婚姻与家庭法 复习题 (2)
- 分享一个用了很久的免费国外空间,适合用于测试
- 本地摄像头应用到远程计算机,3个可在iPad / iPhone上远程查看网络摄像头的应用 | MOS86...
- Android相机预览设置适配及显示方式
- Python之pip升级命令
- 【计量经济学】简单回归模型
热门文章
- hive中删除表的错误Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException...
- 编程之美——题目2 : 回文字符序列
- 如何在数轴上找到一个数的倒数
- ajax 传送很多html字符串到前台例子
- HCIE Security DS V-P-N 备考笔记(幕布)
- shell 第五次作业(函数、数组)
- CTFHUB Web前置技能 题解记录(HTTP部分)
- 窥探源码,让我更加优雅的使用Kafka生产者!
- 谁说前端程序员不了解业务?站出来!
- 五个步骤,搭建企业的“大数据视野”