博主声明:

转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/smile_running

观察者模式(Observer Pattern),是使用比较多的一种设计模式,它的模型一般情况下都是一对多的模型,当然,也不排除有一对一的情况发生。观察者(Observer)与被观察者(Subject),它们存在的关系就是一对多,被观察者也就称为主题,是观察者要关注的对象,这个主题可以同时被很多观察者观察。观察者模式的另一种说法,叫它订阅 — 发布模式,很直观,符合我们的实际应用,也很好理解。

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

观察者模式在实际生活中的应用比比皆是,比如订购每日一报这个业务,送报纸的业务员就会观察哪一家有订购报纸,他就会把报纸给你送到楼下。再者,比如警察抓小偷,其实也是一个意思。警察在抓小偷之前,可能这个小偷是一个惯犯,引起了警察们的注意,所以警察都在事先安排好的点去蹲着观察小偷,也就是观察者。那小偷就是被观察的对象,也就是警察需要观察的主题。

那么,我们就运用警察与小偷这个例子,来实际的编程实现一个观察者模式代码吧。

首先,观察者,也就是警察。需要一个 Observer 观察者接口,所以的警察都有任务,那就是逮捕这个小偷,所以代码应该写为这样:

package com.xww.dp.observer;public interface Observer {/*** 逮捕*/void arrest(String action);
}

既然是接口,就必须有应该警察类来实现这个接口,那我们就叫做警察观察者:PoliceObserver 实现类,代码如下:

package com.xww.dp.observer;public class PoliceObserver implements Observer {private String policeName;public PoliceObserver(String policeName) {this.policeName = policeName;}@Overridepublic void arrest(String action) {System.out.println(policeName + ",准备行动!");}
}

那么,观察者的代码就写好了。接下来是被观察者,也就是小偷。小偷被发现了,他肯定是要逃跑的,所以被观察者接口有一个逃跑的方法:

package com.xww.dp.observer;public interface Subject {void escape();
}

好了,继续我们的被观察者(小偷)实现类,ThiefSubject 实现类,代码如下:

package com.xww.dp.observer;import java.util.ArrayList;
import java.util.List;public class ThiefSubject implements Subject {private List<PoliceObserver> polices = new ArrayList<PoliceObserver>();public void beWatched(PoliceObserver police) {polices.add(police);}/*** 小偷引发了警察的注意* * @param action*/public void trigger(String action) {System.out.println(action);for (PoliceObserver police : polices) {police.arrest(action);}}@Overridepublic void escape() {System.out.println("小偷飞檐走壁,跑了!");}
}

被观察者类中,必须要存放观察者的一个集合,也就是说这个小偷现在被几个警察盯着,小偷与警察是一对多的关系,这里我们把小偷的设定为一个人。

小偷(被观察者)类中,必须要有一个可以添加警察(观察者)的方法,这是一个步骤,也是必要的。添加了警察(观察者),那必定要拿到警察(观察者)的引用,才可以执行警察(观察者)类中的方法。因为警察(观察者)是一个集合,所以我们对这个集合进行遍历,通知每一个警察(观察者)。

好了,到这里我们的观察者模式的代码就写完了。接下来就是要写一个 Main 方法来执行一下,看看结果如何。看代码:

package com.xww.dp.observer;/*** 23种设计模式 —— 观察者模式* * @author xww* @csdn_blog https://blog.csdn.net/smile_Running/column/info/27169*/
public class ObserverPatternClient {public static void main(String[] args) {ThiefSubject thief = new ThiefSubject();PoliceObserver police1 = new PoliceObserver("警察组长,拿着对讲机");PoliceObserver police2 = new PoliceObserver("警员1,拿着警棍");PoliceObserver police3 = new PoliceObserver("警员2,拿着手铐");/*** 小偷被三个警察监视*/thief.beWatched(police1);thief.beWatched(police2);thief.beWatched(police3);thief.trigger("小偷:偷东西,引发了群众报案!");thief.escape();}}

我们实例化了三个警察(观察者),并添加到被观察中进行关联。所以执行代码结果如下:

好了,关于观察者模式的用法就是这样的了。

【设计模式】观察者模式相关推荐

  1. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  2. [Head First设计模式]山西面馆中的设计模式——观察者模式

    原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...

  3. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  4. 【学习笔记】ABAP OOD设计模式 - 观察者模式

    ABAP OOD设计模式 - 观察者模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的 ...

  5. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  6. 设计模式---观察者模式介绍与理解

    设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...

  7. 设计模式-观察者模式 发布/订阅模式

    设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...

  8. 设计模式 | 观察者模式及典型应用

    本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托 ...

  9. 李建忠设计模式——观察者模式

    1.观察者模式(Observer/Event) 1.动机 在软件构建过程中,需要为某些对象建立一种"通知依赖关系"--一个对象(目标)的状态发生改变,所有的依赖对象(观察者对象)都 ...

  10. 设计模式●观察者模式

    设计模式●观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅( ...

最新文章

  1. Hibernate简答题
  2. 【IM】关于无监督降维的理解
  3. .NET Core 跨平台执行命令、脚本
  4. Spring Boot 2.3 版本变化[翻译]
  5. PRD:「FITLIFE」小程序产品需求文档(用户端)
  6. 高并发高可用的 架构实践
  7. v21 v8中资源找不到
  8. 【转录调控网络】基因转录调控网络——转录因子调控网络分析
  9. Qt+OpenCV在arm板上运行实现思路
  10. 浅谈电能质量在线监测装置的基本简介
  11. godot引擎学习7
  12. ceph-deploy源码分析(三)——mon模块 转
  13. UML用例图-用例图
  14. dojo是什么与选择dojo的理由
  15. SpringAop篇 (1) AOP 基础之动态代理的实现
  16. 2k19徽章修改_您可以修改此会议徽章
  17. 华为运营商级路由器配置示例 | 配置HVPLS组网的VPLS PW Redundancy示例
  18. EtherCAT是如何工作的
  19. Qt之QIODevice笔记
  20. 饿了么UI 开关跟多文本编辑,下拉

热门文章

  1. (示例3)涂涂乐开发教程
  2. AR涂涂乐⭐五、关于“4”的部分解决方案
  3. 阿里云账号怎么注册?
  4. 微信转发软件后缀_微信发送不了100M的视频?其实只需要改个后缀,长知识了...
  5. php订单管理系统(源码+数据库+截图)
  6. GTD时间管理阅读笔记
  7. 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算2
  8. 技术人的职场晋级指南:当心“1万小时定律”毁了你!
  9. JAVA编程学习记录(内部类)
  10. 8×8二维载荷谱编制