java 观察者设计模式(十六)
观察者模式(行为型)
当对象间存在一对多关系时,则使用观察者模式(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 观察者设计模式(十六)相关推荐
- java观察者设计模式_Java中的观察者设计模式
java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...
- Java学习系列(十六)Java面向对象之基于TCP协议的网络通信
TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...
- 从零开始学java(二十六)--多维数组,多维数组存储表格数据
从零开始学java(二十六)--多维数组 多维数组 多维数组存储表格数据 多维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(学习 ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- java监听设计模式(java观察者设计模式)
今天给大家分享一下观察者设计模式(监听设计模式),该模式在很多主流得框架.源码中使用率非常高.在分享之前先给大家讲一个我们使用手机的一个场景,我们都用过手机,当我们手机来电话的时候,会有各种复杂的操作 ...
- java集合练习题十六个国家随机分为四组
原题目是这样的: 已知有十六支男子足球队参加2008北京奥运会,根据已学知识点,讲16支球队随机分为4组,"科特迪瓦","阿根廷","澳大利亚&quo ...
- 201771010110孔维滢《面向对象程序设计Java》第十六周实验总结
理论知识部分: 1.程序与进程: 程序是一段静态的代码,它是应用程序执行的蓝本. 进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 2.多线程 多线程是进程执行过程中产生的 ...
- Java设计模式(十六):生成器设计模式
1.应用场景 在软件的设计中,我们可能经常会遇到需要构建某个复杂的对象(比如在游戏开发中,进行人物角色的构建),建造该对象的"过程"是稳定的(对于一个人设来都有身体,脸,发型,手脚 ...
- 【设计模式十六之装饰模式】装饰者模式
Decorator Pattern装饰模式 细说装饰模式 细说装饰模式 定义 UML模型 场景 场景一 场景二 代码 代码一 代码二 基于UML的代码 装饰模式应用和注意事项 细说装饰模式 提示: 博 ...
最新文章
- Learn OpenGL (七):摄像机
- 使用maven导入jar包
- (完美解决)linux服务器安装anaconda并且配置好jupyter从而windows远程访问
- 自制树莓派“防松鼠神器”在Reddit火了,13行代码就能让AI替你护食,成本300+元...
- android webview 获取 title,【报Bug】app webview 安卓机 title显示问题
- ajax传递字符,Ajax怎么传递特殊字符的数据
- js 获取对象属性个数
- MUI Picker选择器 自定义省市地址三级联动
- python设置路径变量_python – Bokeh中设置的静态路径变量在哪里(对于create_html_snippet)...
- android程序 幻灯片,安卓看图软件 要可以直接幻灯片一个包含很
- retinaface代码讲解_Pytorch-RetinaFace 详解
- macbook黑屏_macbook air黑屏无法唤醒怎么办 macbook air黑屏无法唤醒解决方法
- 蓝牙连接测试系统软件,蓝牙测试软件官方版
- JavaScript每日一题 20170207
- 企业网络营销分析报告
- 数学符号 参考手册大全
- 计算机网络 408考纲,2018考研计算机408考试大纲.pdf
- 供水管道损坏的原因及预防修复措施
- JavaScript基础知识之BOM
- 我也有了BLOG,欢迎交流