【设计模式】观察者模式
博主声明:
转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。
本文首发于此 博主:威威喵 | 博客主页: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();}}
我们实例化了三个警察(观察者),并添加到被观察中进行关联。所以执行代码结果如下:
好了,关于观察者模式的用法就是这样的了。
【设计模式】观察者模式相关推荐
- Python设计模式-观察者模式
Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...
- [Head First设计模式]山西面馆中的设计模式——观察者模式
原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 【学习笔记】ABAP OOD设计模式 - 观察者模式
ABAP OOD设计模式 - 观察者模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的 ...
- Java设计模式-观察者模式(订阅发布模式)
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...
- 设计模式---观察者模式介绍与理解
设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...
- 设计模式-观察者模式 发布/订阅模式
设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...
- 设计模式 | 观察者模式及典型应用
本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托 ...
- 李建忠设计模式——观察者模式
1.观察者模式(Observer/Event) 1.动机 在软件构建过程中,需要为某些对象建立一种"通知依赖关系"--一个对象(目标)的状态发生改变,所有的依赖对象(观察者对象)都 ...
- 设计模式●观察者模式
设计模式●观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅( ...
最新文章
- Hibernate简答题
- 【IM】关于无监督降维的理解
- .NET Core 跨平台执行命令、脚本
- Spring Boot 2.3 版本变化[翻译]
- PRD:「FITLIFE」小程序产品需求文档(用户端)
- 高并发高可用的 架构实践
- v21 v8中资源找不到
- 【转录调控网络】基因转录调控网络——转录因子调控网络分析
- Qt+OpenCV在arm板上运行实现思路
- 浅谈电能质量在线监测装置的基本简介
- godot引擎学习7
- ceph-deploy源码分析(三)——mon模块 转
- UML用例图-用例图
- dojo是什么与选择dojo的理由
- SpringAop篇 (1) AOP 基础之动态代理的实现
- 2k19徽章修改_您可以修改此会议徽章
- 华为运营商级路由器配置示例 | 配置HVPLS组网的VPLS PW Redundancy示例
- EtherCAT是如何工作的
- Qt之QIODevice笔记
- 饿了么UI 开关跟多文本编辑,下拉