【设计模式】—— 观察者模式Observer

简介:

  模式意图

  观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布——其他人接受。

  这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化

  模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面。只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程。

  这个模式代码相对来说比较容易理解,而且应用很广泛。

  应用场景

  1 当一个模型有几个展现方面,通过修改一个展现,顺便更新其他的。就好比一个网站的有web端,也有移动端,当web端的数据发生变化时,移动端的数据展现也要更新。

  2 对一个对象发生改变,而不知道将有多少对象会发生改变时,利用这种模式可以有效的管理对象。

  模式结构

  Subject 抽象的主题角色

interface Subject{
    public void attach(Observer observer);
    public void detach(Observer observer);
    void notifyObservers();
}

  ConcreteSubject 具体的主题角色,内部有一个容易,用于存放订阅者

复制代码
class ConcreteSubject implements Subject{
    List<Observer> list = new ArrayList();
    public void attach(Observer observer) {
        list.add(observer);
    }
    public void detach(Observer observer) {
        list.remove(observer);
    }
    public void notifyObservers() {
        for(Observer o : list){
            o.update();
        }
    }
}
复制代码

  Observer 抽象的订阅者角色

interface Observer{
    public void update();
}

  ConcreteObserver 具体的订阅者

复制代码
class ConcreteObserver1 implements Observer{
    public void update() {
        System.out.println("ConcreteObserver1 update");
    }
}
class ConcreteObserver2 implements Observer{
    public void update() {
        System.out.println("ConcreteObserver2 update");
    }
}
class ConcreteObserver3 implements Observer{
    public void update() {
        System.out.println("ConcreteObserver3 update");
    }
}
复制代码

  全部代码

复制代码
 1 package com.xingoo.test.design.observer;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 interface Subject{
 7     public void attach(Observer observer);
 8     public void detach(Observer observer);
 9     void notifyObservers();
10 }
11 class ConcreteSubject implements Subject{
12     List<Observer> list = new ArrayList();
13     public void attach(Observer observer) {
14         list.add(observer);
15     }
16     public void detach(Observer observer) {
17         list.remove(observer);
18     }
19     public void notifyObservers() {
20         for(Observer o : list){
21             o.update();
22         }
23     }
24 }
25 interface Observer{
26     public void update();
27 }
28 class ConcreteObserver1 implements Observer{
29     public void update() {
30         System.out.println("ConcreteObserver1 update");
31     }
32 }
33 class ConcreteObserver2 implements Observer{
34     public void update() {
35         System.out.println("ConcreteObserver2 update");
36     }
37 }
38 class ConcreteObserver3 implements Observer{
39     public void update() {
40         System.out.println("ConcreteObserver3 update");
41     }
42 }
43 public class Client {
44     public static void main(String[] args) {
45         Subject subject = new ConcreteSubject();
46         Observer o1 = new ConcreteObserver1();
47         Observer o2 = new ConcreteObserver2();
48         Observer o3 = new ConcreteObserver3();
49         subject.attach(o1);
50         subject.attach(o2);
51         subject.attach(o3);
52         subject.notifyObservers();
53         
54         subject.detach(o2);
55         subject.notifyObservers();
56     }
57 }
复制代码

  运行结果

复制代码
ConcreteObserver1 update
ConcreteObserver2 update
ConcreteObserver3 update
ConcreteObserver1 update ConcreteObserver3 update
复制代码

 

本文转自博客园xingoo的博客,原文链接:【设计模式】—— 观察者模式Observer,如需转载请自行联系原博主。
相关文章
|
13天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
1月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
37 0
|
9天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
20 3
|
21天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
33 9
|
20天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
27 2
|
28天前
|
设计模式 监控 UED
设计模式之观察者模式
【10月更文挑战第12天】 观察者模式是一种行为型设计模式,定义了一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动更新。主要由主题(被观察者)和观察者组成,实现对象间的松耦合,广泛应用于用户界面、事件驱动系统和数据监控等领域。
|
30天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
本教程详细讲解Kotlin语法,适合深入学习。对于快速掌握Kotlin,推荐“简洁”系列教程。本文特别介绍了观察者模式,包括使用Java API和Kotlin委托属性(如Delegates.observable)实现的方法,旨在帮助开发者更高效地实现和优化观察者模式的应用。
32 3
|
2月前
|
设计模式 Java 关系型数据库
设计模式——观察者模式
观察者模式介绍、观察者模式优化天气预报案例、JDK 的Observable类和Observer类
设计模式——观察者模式
|
1月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
28 0
|
3月前
|
设计模式 存储 前端开发
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
文章详细介绍了观察者模式(Observer Pattern),这是一种对象行为型模式,用于建立对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文中通过交通信号灯与汽车的案例以及多人联机对战游戏的设计方案,阐述了观察者模式的动机和应用场景。接着,文章介绍了观察者模式的结构、角色、优点、缺点以及适用情况,并通过代码示例展示了如何在Java中实现观察者模式。此外,还探讨了观察者模式在MVC架构中的应用以及Java中对观察者模式的支持。
【十四】设计模式~~~行为型模式~~~观察者模式(Java)

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75