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

相关推荐
Tracy-221 小时前
啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!
java·spring
未定义.2212 小时前
Java设计模式实战:策略模式在SimUDuck问题中的应用
java·设计模式·策略模式
码熔burning3 小时前
【NIO番外篇】之组件 Channel
java·nio·channel
卡尔曼的BD SLAMer4 小时前
问题 | 针对SSM(Spring + Spring MVC + MyBatis)框架的去Spring MVC强化版学习路线
java·spring·mvc·mybatis
春生野草4 小时前
0413-多态、Object类方法、访问权限修饰符、装箱拆箱、128陷阱
java·开发语言
烁3474 小时前
每日一题(小白)暴力娱乐篇25
java·数据结构·算法·娱乐
烁3474 小时前
每日一题(小白)暴力娱乐篇26
java·开发语言·算法·娱乐
小白的一叶扁舟5 小时前
Java设计模式全解析(共 23 种)
java·开发语言·设计模式·springboot
kkkkatoq6 小时前
设计模式 四、行为设计模式(2)
java·开发语言·设计模式
隔壁小王攻城狮6 小时前
完整源码停车场管理系统,含新能源充电系统,实现了停车+充电一体化
java·开源·iot·停车场系统·新能源汽车充电·停车场管理系统源码