观察者模式,顾名思义,监视模式,比如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---设计模式之:观察者模式相关推荐

  1. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  2. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  3. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  5. Java 设计模式之观察者模式

    一.了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 典型的问题比如报社,只要你是他们的订户,他们 ...

  6. [java设计模式简记] 观察者模式(Observer-Pattern)

    观察者模式(Observer-Pattern) 数据主体拥有需要数据的对象的数据,并且数据改变时需要数据的对象要及时知道 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖 ...

  7. (设计模式十三)java设计模式之观察者模式

    特别说明:本篇博客来自于设计模式菜鸟教程 观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于 ...

  8. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  9. Java设计模式:观察者模式

    观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 如果这句话不好理解 可 ...

  10. Java 设计模式之观察者模式(Observer pattern)

    观察者模式在软件编程中用的较多,我不善于表达我就用在网上看到的故事,和生活的例子说下基本思想 故事: 小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入 ...

最新文章

  1. 安装win下的Anaconda ----针对python3.6.4版本
  2. matlab索引程序,Matlab索引到逻辑索引
  3. 电脑卡顿不流畅是什么原因_为什么Windows/iOS操作很流畅,而Linux/Android却很卡顿呢...
  4. java udp 工具类_java基于UDP实现图片群发功能
  5. 深度学习与TensorFlow: VGG论文笔记
  6. 详解如何修改Laravel Auth使用salt和password来认证用户
  7. 史上最大内存!曝iPhone 14 Pro系列运行内存将增至8GB
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的电影院订票系统
  9. spring mvc+myibatis项目大致框架-spring mvc wendang
  10. centos7安装abaqus2020
  11. SFP光模块高低温老化测试 高低温试验测试设备
  12. linux超市参数,TI AM5708开发板产品参数介绍
  13. 城市智慧水务供水测试床在工业互联网上发布
  14. 优惠券通用测试要点 V1.1
  15. 格签名相似概念区分: SVP、SIS、LWE的区分
  16. 做一套给三星手机用的导航栏图标(伪装Windows10移动版)
  17. 16种常用的数据分析方法-因子分析
  18. Socaverse正在推动体育文化成为Web3发展的新驱动力
  19. 【帝国CMS插件】支持7.5 7.2 移动同步生成插件 帝国多端访问必备插件带详细安装教程
  20. 麒麟操作系统基于linux哪个版本_linux操作系统排行_桌面操作系统难在哪?国产麒麟系统应用仅为Windows十...

热门文章

  1. Happy Mmall项目总结
  2. select清除右侧的小三角
  3. 接口获取循环展示的数据,hover时展示不同的背景图片
  4. Debian 中 BCM43142 蓝牙无法使用问题
  5. go学习总结(七)运算符
  6. busybox移植到ARM开发板
  7. java openresty 调用_Openresty使用
  8. 中文自然语言处理——jieba中文分词器
  9. 凤凰金融邢志峰:人工智能打败人类只是一个开始,AI真正落地业务场景仍面临严峻挑战
  10. python编译器MuEditor下载地址