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

相关推荐
SimonKing2 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean3 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven974 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55113 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河13 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程16 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅18 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者19 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺19 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端