java---设计模式之:观察者模式
观察者模式,顾名思义,监视模式,比如xxlistener ,常用于 监听事件,消息通知等场合;
现在做个简单的例子:
用户1 --------->观察者1
用户2 --------->观察者2
用户3 --------->观察者3
微信公众号1 --------->被观察者1
微信公众号2 --------->被观察者2
用户1订阅了公众号1和2
用户2订阅了公众号2
用户3订阅了公众号1
微信公众号则根据订阅用户发送消息
观察者和被观察者可以抽象成一个接口(建议不要用类,拓展性不好),然后由具体的观察者和被观察者去实现对应的方法
观察者需要有一个能够接收消息的方法
被观察者需要有:增加观察者。删除观察者,发送消息的方法
用代码实践一下:
定义观察者接口
public interface Gcz{
void updateMessage(String appname,String message);
}
定义被观察者接口
public interface Bgcz{
//定义观察者集合,根据集合成员发送消息
private List<Gcz> gczList = new ArrayList<Gcz>();
void addGcz(Gcz gcz);
void removeGcz(Gcz gcz);
void sendMessage(String message);
}
//定义观察者1
public class Gcz1 implements Gcz{
private String name = "gcz1";
@Override
public void updateMessage(String appname,String message){
System.out.println(appname+":"+name+",您有新消息:"+message);
}
}
//定义观察者2
public class Gcz2 implements Gcz{
private String name = "gcz2";
@Override
public void updateMessage(String appname,String message){
System.out.println(appname+":"+name+",您有新消息:"+message);
}
}
//定义观察者3
public class Gcz3 implements Gcz{
private String name = "gcz3";
@Override
public void updateMessage(String appname,String message){
System.out.println(appname+":"+name+",您有新消息:"+message);
}
}
//定义被观察者1
public class Bgcz1 implements Bgcz{
private String appname = "微信公众号1";
private List<Gcz> gczList = new ArrayList<Gcz>();
@Override
public void addGcz(Gcz gcz){
if(!gczList.contains(gcz)){
gczList.add(gcz);
}
}
@Override
public void removeGcz(Gcz gcz){
if(gczList.contains(gcz)){
gczList.remove(gcz);
}
}
@Override
public void sendMessage(String message){
for(Gcz gcz2 : gczList){
gcz2.updateMessage(appname,message);
}
}
}
//定义被观察者2
public class Bgcz2 implements Bgcz{
private String appname="微信公众号2";
private List<Gcz> gczList = new ArrayList<Gcz>();
@Override
public void addGcz(Gcz gcz){
if(!gczList.contains(gcz)){
gczList.add(gcz);
}
}
@Override
public void removeGcz(Gcz gcz){
if(gczList.contains(gcz)){
gcz.remove(gcz);
}
}
@Override
public void sendMessage(String message){
for(Gcz gcz2 : gczList){
gcz2.updateMessage(appname,message);
}
}
}
//测试
Gcz gcz1 = new Gcz1();//定义具体观察者1
Gcz gcz2 = new Gcz2();//定义具体观察者2
Gcz gcz3 = new Gcz3();//定义具体观察者3
Bgcz bgcz1 = new Bgcz1();//定义被观察者1
Bgcz bgcz2 = new Bgcz2();//定义被观察者2
//给被观察者1 增加 观察者1和观察者2
bgcz1.add(gcz1);
bgcz1.add(gcz2);
//给被观察者2 增加 观察者1
bgcz2.add(gcz1);
bgcz1.sendMessage("开始跑起来了。。。");
bgcz2.sendMessage("第二个也运行起来了");
结果:
微信公众号1:gcz1,您有新消息:开始跑起来了。。。
微信公众号1:gcz2,您有新消息:开始跑起来了。。。
微信公众号2:gcz3,您有新消息:第二个也运行起来了
java---设计模式之:观察者模式相关推荐
- java 观察者模式_图解Java设计模式之观察者模式
图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...
- Java设计模式系列--观察者模式(使用)
原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...
- Java设计模式之观察者模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- java设计模式 观察者模式_理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...
- Java 设计模式之观察者模式
一.了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 典型的问题比如报社,只要你是他们的订户,他们 ...
- [java设计模式简记] 观察者模式(Observer-Pattern)
观察者模式(Observer-Pattern) 数据主体拥有需要数据的对象的数据,并且数据改变时需要数据的对象要及时知道 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖 ...
- (设计模式十三)java设计模式之观察者模式
特别说明:本篇博客来自于设计模式菜鸟教程 观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于 ...
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- Java设计模式:观察者模式
观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 如果这句话不好理解 可 ...
- Java 设计模式之观察者模式(Observer pattern)
观察者模式在软件编程中用的较多,我不善于表达我就用在网上看到的故事,和生活的例子说下基本思想 故事: 小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入 ...
最新文章
- 安装win下的Anaconda ----针对python3.6.4版本
- matlab索引程序,Matlab索引到逻辑索引
- 电脑卡顿不流畅是什么原因_为什么Windows/iOS操作很流畅,而Linux/Android却很卡顿呢...
- java udp 工具类_java基于UDP实现图片群发功能
- 深度学习与TensorFlow:	VGG论文笔记
- 详解如何修改Laravel Auth使用salt和password来认证用户
- 史上最大内存!曝iPhone 14 Pro系列运行内存将增至8GB
- 基于JAVA+SpringMVC+Mybatis+MYSQL的电影院订票系统
- spring mvc+myibatis项目大致框架-spring mvc wendang
- centos7安装abaqus2020
- SFP光模块高低温老化测试 高低温试验测试设备
- linux超市参数,TI AM5708开发板产品参数介绍
- 城市智慧水务供水测试床在工业互联网上发布
- 优惠券通用测试要点 V1.1
- 格签名相似概念区分: SVP、SIS、LWE的区分
- 做一套给三星手机用的导航栏图标(伪装Windows10移动版)
- 16种常用的数据分析方法-因子分析
- Socaverse正在推动体育文化成为Web3发展的新驱动力
- 【帝国CMS插件】支持7.5 7.2 移动同步生成插件 帝国多端访问必备插件带详细安装教程
- 麒麟操作系统基于linux哪个版本_linux操作系统排行_桌面操作系统难在哪?国产麒麟系统应用仅为Windows十...