博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-观察者模式
阅读量:6785 次
发布时间:2019-06-26

本文共 2049 字,大约阅读时间需要 6 分钟。

观察者模式

引言

今天开车出去有事,还挺赶时间的,突然遇到了一个红灯,这红灯时间可真长,等了好久终于看到变绿灯了,赶紧开车过去。

正文

观察者模式是指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会收到它的通知,然后做出改变。

核心思想

通过对目标和观察者之间建立了一套触发机制,降低了两者间的耦合关系,因为这两者仅仅都是抽象耦合。

代码实现

讲解

//抽象观察者public interface Observer {    void response();}复制代码
//抽象目标public abstract class Subject {    protected List
observers = new ArrayList<>(); public void add(Observer observer) { observers.add(observer); } public void remove(Observer observer) { observers.remove(observer); } //通知 public abstract void notifyObserver();}复制代码
//具体目标public class ConcreteSubject extends Subject {    @Override    public void notifyObserver() {        System.out.println("此时发生了一些变化...");        for (Object obj : observers) {            ((Observer) obj).response();        }    }}复制代码
//具体观察者public class ConcreteObserver implements Observer {    @Override    public void response() {        System.out.println("具体观察者对变化作出反应");    }}复制代码

实例

//抽象交通信号灯类(目标)public abstract class TrafficLights {    protected List
drivers = new ArrayList<>(); public void add(Driver driver) { drivers.add(driver); } public void remove(Driver driver) { drivers.remove(driver); } public abstract void notifyDriver();}复制代码
public class RedLight extends TrafficLights {    @Override    public void notifyDriver() {        System.out.println("红灯变成绿灯了...");        for (Driver driver : drivers) {            driver.response();        }    }}复制代码
//司机接口(观察者)public interface Driver {    void response();}复制代码
public class MeDriver implements Driver {    @Override    public void response() {        System.out.println("红灯告诉我变成绿灯了,我得开车走了");    }}复制代码
//调用public class Main {    public static void main(String[] args) {        TrafficLights redLight = new RedLight();        MeDriver meDriver = new MeDriver();        redLight.add(meDriver);        redLight.notifyDriver();    }}复制代码

输出结果

红灯变成绿灯了...红灯告诉我变成绿灯了,我得开车走了复制代码

总结

观察者模式很好的处理了一对多对象之间的耦合关系,但并没有完全解除之间的依赖关系,处理不好可能会造成循环引用,同时如果观察者对象过多时,通知的发布会效率变低(参考一个高速堵车)。

转载地址:http://gucgo.baihongyu.com/

你可能感兴趣的文章
腾讯云答治茜:云计算为独角兽和传统企业提供了哪些沃土?
查看>>
Spark on YARN 部署案例
查看>>
RedHat发布JBoss 7.2,完全支持Java EE 8规范
查看>>
kubernetes1.9.2基于kubeadm的高可用安装HA
查看>>
「性能优化之道」每秒上万并发下的Spring Cloud参数优化实战
查看>>
App启动流程
查看>>
原理 | 分布式链路跟踪组件 SOFATracer 和 Zipkin 模型转换
查看>>
我的第一篇博客
查看>>
手把手教你如何用Python从PDF文件中导出数据(附链接)
查看>>
维珍银河完成最长距离火箭飞行,下一步剑指太空旅行
查看>>
[Python]attributeError:'module' object has no attribute 'dump'
查看>>
Docker系列教程11-使用Nexus管理Docker镜像
查看>>
业界最全,阿里云混合云灾备服务上线!
查看>>
Windows Linux 子系统可以在资源管理器中打开
查看>>
WebStorm文件类型关联设置
查看>>
13.1 Spring MVC 关于controller的字符编码
查看>>
理发店与 App 定价模型
查看>>
ES6(数组)
查看>>
php simplexml_load_file 函数执行不稳定
查看>>
C#,VB.NET如何将Word转换为PDF和Text
查看>>