观察者模式(Observer)

​观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监控某一个主题对象。这个主题对象在状态上发生变化时,会通知其他的观察者对象,让他们能够自动更新自己。

被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。

java 复制代码
//抽象的观察者
public interface Guancazhe {
    public void update();
}

//抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):
public interface Guancazhe1 {
    public void addGuancazhe(Guancazhe guancazhe);    
    public void removeGuancazhe(Guancazhe guancazhe);  
    public void notifyGuancazhe(String str);
}

public class Baobiao implements Guancazhe{
    public void update() {
        // TODO Auto-generated method stub
        System.out.println("运输车有行动,保安贴身保护");
    }
}
public class Xiaotou implements Guancazhe{
    public void update() {
        // TODO Auto-generated method stub
        System.out.println("运输车有行动,强盗准备动手"); 
    }
}

public class Police implements Guancazhe{
    public void update() {
    // TODO Auto-generated method stub
    System.out.println("运输车有行动,警察护航");
    }
}

//具体的被观察者
public class Beiguancezhe implements Guancazhe1{
    //观察者集合
    private List<Guancazhe> list = new ArrayList<Guancazhe>();
    public void addGuancazhe(Guancazhe guancazhe) {
        // TODO Auto-generated method stub
        list.add(guancazhe);
    }
    public void removeGuancazhe(Guancazhe guancazhe) {
        // TODO Auto-generated method stub
        list.remove(guancazhe);
    }
    public void notifyGuancazhe(String str) {
        // TODO Auto-generated method stub
        for (Guancazhe guancazhe : list)  {  
            guancazhe.update();  
        } 
    }
}

public static void main(String[] args) {
	// TODO Auto-generated method stub
	Beiguancezhe beiguancezhe = new Beiguancezhe();  		  
    Police police = new Police();  
    Baobiao  baobiao= new Baobiao();  
    Xiaotou xiaotou = new Xiaotou();  
    beiguancezhe.addGuancazhe(police);  
    beiguancezhe.addGuancazhe(baobiao);  
    beiguancezhe.addGuancazhe(xiaotou);  
    beiguancezhe.notifyGuancazhe(null);
}

使用场合

(1)当一个抽象模型,其中一个方面依赖于另一方面,把这两者封装在独立的对象中,使其可以独立的改变和复用。

(2)改变一个对象需要改变其他对象,但不知道有多少对象有待于改变。

(3)一个对象必须通知其他对象,但又能假定这些对象(也就是这些对象是紧密耦合的),比如数据采集模块,事先并不知道其他对象是什么。

优点

(1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。

(2)观察者模式支持广播通信,被观察者会向所有登记过的观察者发出通知。

缺点

(1)如果一个被观察者对象有很多观察者的话,将所有的观察者都通知会花费很多时间。

(2)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。

相关推荐
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地13 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
莫逸风15 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898616 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112316 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员17 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风336617 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李17 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
前端双越老师19 小时前
如何以前端视角(非0基础)学 Java ?
java·node.js·全栈