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

相关推荐
不会Hello World的小苗16 分钟前
Java——列表(List)
java·python·list
二十七剑1 小时前
jvm中各个参数的理解
java·jvm
东阳马生架构3 小时前
JUC并发—9.并发安全集合四
java·juc并发·并发安全的集合
计算机小白一个3 小时前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
菠菠萝宝3 小时前
【Java八股文】10-数据结构与算法面试篇
java·开发语言·面试·红黑树·跳表·排序·lru
不会Hello World的小苗3 小时前
Java——链表(LinkedList)
java·开发语言·链表
Allen Bright4 小时前
【Java基础-46.3】Java泛型通配符详解:解锁类型安全的灵活编程
java·开发语言
柃歌4 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
柃歌4 小时前
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
java·数据结构·笔记·学习·算法
是姜姜啊!4 小时前
redis的应用,缓存,分布式锁
java·redis·spring