观察者模式(行为型)

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

一、观察者模式介绍

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

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

1、业务场景:很好吃,但是库存没了,许多顾客都关注青芒何时能到货?

2、观察者模式 ---------一个对象状态改变时通知其他对象。为的是尽量弱化对象间的依赖。

3、时序图:观察者模式 ---------一个对象状态改变时通知其他对象。

二、测试代码:

1、创建观察的接口:

public interface Observer {void update();
}

2、被通知的客户:

public class CustomerObserver implements Observer {private String name;public CustomerObserver(String name){this.name = name;}@Overridepublic void update() {System.out.println(name + "购买青芒");}
}

3、创建关注的抽象类:

import java.util.ArrayList;
import java.util.List;public abstract class Attentions {//关注客户列表protected List<Observer> observers = new ArrayList();//关注顾客public void add(Observer observer) {observers.add(observer);}//取消关注public void remove(Observer observer) {observers.remove(observer);}//发通知public abstract void notifyObservers();
}

4、到货通知类的创建:

public class MangoAttention extends Attentions{@Overridepublic void notifyObservers() {//遍历观察者集合,调用每一个顾客的购买方法for(Observer obs : observers) {obs.update();}}//芒果到货了public void perform(){this.notifyObservers();}
}

5、客户端测试代码:

/*** 观察者模式* 顾客关注了芒果,降价时通知他们*/
public class ObserverClient {public static void main(String[] args) {MangoAttention attentions = new MangoAttention();//目标attentions.add(new CustomerObserver("nandao"));attentions.add(new CustomerObserver("anan"));attentions.add(new CustomerObserver("lili"));attentions.add(new CustomerObserver("lisi"));//到货attentions.perform();}
}

6、执行结果:

三、JDK 对观察者模式的支持

1、Java本身也对观察者模式做了支持:

2、测试代码:到货通知创建,继承JDK的观察的抽象类;

import java.util.Observable;public class Mango extends Observable {private String name;public Mango(String name){this.name = name;}//芒果到货了public void perform(){this.setChanged();this.notifyObservers();}
}

3、 需要通知的客户端类:

import java.util.Observable;
import java.util.Observer;public class Customer implements Observer {private String name;public Customer(String name){this.name = name;}@Overridepublic void update(Observable o, Object arg) {System.out.println(name + "购买青芒");}
}

4、客户端测试类:

/*** 观察者模式* 顾客关注了芒果商品,到货时通知他们*/
public class JdkObserverClient {public static void main(String[] args) {Mango attentions = new Mango("芒果");attentions.addObserver(new Customer("nandao"));attentions.addObserver(new Customer("anan"));attentions.addObserver(new Customer("lisi"));attentions.addObserver(new Customer("mark"));attentions.perform();}
}

5、 执行结果:

到此观察者模式分享完毕,下一篇我们分享命令模式,敬请期待!

java 观察者设计模式(十六)相关推荐

  1. java观察者设计模式_Java中的观察者设计模式

    java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...

  2. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  3. 从零开始学java(二十六)--多维数组,多维数组存储表格数据

    从零开始学java(二十六)--多维数组 多维数组 多维数组存储表格数据 多维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(学习 ...

  4. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  5. java监听设计模式(java观察者设计模式)

    今天给大家分享一下观察者设计模式(监听设计模式),该模式在很多主流得框架.源码中使用率非常高.在分享之前先给大家讲一个我们使用手机的一个场景,我们都用过手机,当我们手机来电话的时候,会有各种复杂的操作 ...

  6. java集合练习题十六个国家随机分为四组

    原题目是这样的: 已知有十六支男子足球队参加2008北京奥运会,根据已学知识点,讲16支球队随机分为4组,"科特迪瓦","阿根廷","澳大利亚&quo ...

  7. 201771010110孔维滢《面向对象程序设计Java》第十六周实验总结

    理论知识部分: 1.程序与进程: 程序是一段静态的代码,它是应用程序执行的蓝本. 进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 2.多线程 多线程是进程执行过程中产生的 ...

  8. Java设计模式(十六):生成器设计模式

    1.应用场景 在软件的设计中,我们可能经常会遇到需要构建某个复杂的对象(比如在游戏开发中,进行人物角色的构建),建造该对象的"过程"是稳定的(对于一个人设来都有身体,脸,发型,手脚 ...

  9. 【设计模式十六之装饰模式】装饰者模式

    Decorator Pattern装饰模式 细说装饰模式 细说装饰模式 定义 UML模型 场景 场景一 场景二 代码 代码一 代码二 基于UML的代码 装饰模式应用和注意事项 细说装饰模式 提示: 博 ...

最新文章

  1. Learn OpenGL (七):摄像机
  2. 使用maven导入jar包
  3. (完美解决)linux服务器安装anaconda并且配置好jupyter从而windows远程访问
  4. 自制树莓派“防松鼠神器”在Reddit火了,13行代码就能让AI替你护食,成本300+元...
  5. android webview 获取 title,【报Bug】app webview 安卓机 title显示问题
  6. ajax传递字符,Ajax怎么传递特殊字符的数据
  7. js 获取对象属性个数
  8. MUI Picker选择器 自定义省市地址三级联动
  9. python设置路径变量_python – Bokeh中设置的静态路径变量在哪里(对于create_html_snippet)...
  10. android程序 幻灯片,安卓看图软件 要可以直接幻灯片一个包含很
  11. retinaface代码讲解_Pytorch-RetinaFace 详解
  12. macbook黑屏_macbook air黑屏无法唤醒怎么办 macbook air黑屏无法唤醒解决方法
  13. 蓝牙连接测试系统软件,蓝牙测试软件官方版
  14. JavaScript每日一题 20170207
  15. 企业网络营销分析报告
  16. 数学符号 参考手册大全
  17. 计算机网络 408考纲,2018考研计算机408考试大纲.pdf
  18. 供水管道损坏的原因及预防修复措施
  19. JavaScript基础知识之BOM
  20. 我也有了BLOG,欢迎交流

热门文章

  1. 面试后哪些表现,说明你面试失败了?
  2. RNN及其变种LSTM/GRU/SRU
  3. 知识付费找副业的平台哪个好?业内人士这么说
  4. golang elasticsearch 查询
  5. CUDA并行程序设计 GPU编程指南: 第一章:超级计算简史
  6. ISAKMP - 密钥交换
  7. 理想L9供应链清单 | 整车企业供应链系列盘点 | 爱普搜汽车
  8. 副业项目:小红书教资项目,月入10000+
  9. ICG-PEG-CHO,吲哚菁绿-聚乙二醇-醛基 荧光染料试剂说明
  10. 安全漫谈:下一代防火墙慧眼识应用