观察者模式(Observer)

​观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监控某一个主题对象。这个主题对象在状态上发生变化时,会通知其他的观察者对象,让他们能够自动更新自己。
被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。

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

相关推荐

  1. 观察模式 Observer

    2024-02-05 13:32:07       60 阅读
  2. 观察模式(Observer)

    2024-02-05 13:32:07       50 阅读
  3. 设计模式-观察模式 Observer

    2024-02-05 13:32:07       44 阅读
  4. 【设计模式观察模式Observer Pattern

    2024-02-05 13:32:07       52 阅读
  5. 设计模式-观察模式Observer Pattern)

    2024-02-05 13:32:07       45 阅读
  6. 设计模式观察模式Observer Pattern)

    2024-02-05 13:32:07       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-05 13:32:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-05 13:32:07       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-05 13:32:07       82 阅读
  4. Python语言-面向对象

    2024-02-05 13:32:07       91 阅读

热门阅读

  1. 过年手机推荐

    2024-02-05 13:32:07       46 阅读
  2. 前端学习之路(2) Vue3响应式模式设计原理

    2024-02-05 13:32:07       35 阅读
  3. Redis:bigkeys内存分析

    2024-02-05 13:32:07       51 阅读
  4. php 函数三

    2024-02-05 13:32:07       40 阅读
  5. 两次NAT

    两次NAT

    2024-02-05 13:32:07      49 阅读
  6. 3.7 GNU ARM汇编语言

    2024-02-05 13:32:07       51 阅读
  7. 华为配置车地通信快速切换实验

    2024-02-05 13:32:07       41 阅读
  8. 系统分析师-23年-上午答案

    2024-02-05 13:32:07       43 阅读
  9. 【使用 Python 进行 NLP】 第 2 部分 NLTK

    2024-02-05 13:32:07       49 阅读
  10. 合并排序算法

    2024-02-05 13:32:07       58 阅读
  11. JVM介绍

    JVM介绍

    2024-02-05 13:32:07      46 阅读
  12. HTTP/2

    2024-02-05 13:32:07       45 阅读