【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)

简介: 【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)

定义

所谓观察者模式就是你是被观察的那个对象,你爸爸妈妈就是观察者,一天24h盯着你,一旦你不听话,他们要你听话,你的状态发生变化以后,他们接收到你的状态发生了改变。

结构

如下图,服务器就作为被观察者,三个传感器就是观察者。这是一种抽象的表达方式!

  • Subject被观察的目标
  • Observer观察者抽象类
  • 具体观察者实现类
  • Client客户端

Demo | 代码

Subject目标类

我们需要一个Subject目标类,内部含有观察者对象的集合,在必要的时候触发事件。

  • Subject被观察的目标
  • Observer观察者抽象类
  • 具体观察者实现类
  • Client客户端
/**
 * 这个Server类就是服务类,作为Subject,别观察的目标!
 * @author linghu
 * @date 2024/7/4 11:50
 */
public class Server {
    private List<Observer> observers= new ArrayList<Observer>();
    private int cpu;
    private int memory;
    public Server() {
    }
    //变更服务器状态
    public void changeState(int cpu,int memory){
        this.cpu=cpu;
        this.memory=memory;
        System.out.println("CPU:" + cpu + "%,内存占用:" + memory + "%");
        //通知所有观察者对象,使它们能够自动更新自己
        notifyAllObservers();
    }
    public Server(int cpu, int memory) {
        this.cpu = cpu;
        this.memory = memory;
    }
    public int getCpu() {
        return cpu;
    }
    public void setCpu(int cpu) {
        this.cpu = cpu;
    }
    public int getMemory() {
        return memory;
    }
    public void setMemory(int memory) {
        this.memory = memory;
    }
    public void addObserver(Observer observer){
        observers.add(observer);
    }
    public void notifyAllObservers(){
        for (Observer observer :observers) {
            observer.update();
        }
    }
}

Observer抽象观察者

这个抽象主要是封装了目标对象和观察者要做的事情。

/**
 * @author linghu
 * @date 2024/7/4 12:02
 */
public abstract class Observer {
    protected Server subject;//服务类,目标对象
    public abstract void update();//观察者要做的事情
}

观察者1 | CPU监听器

/**
 * @author linghu
 * @date 2024/7/4 12:04
 * CPU监听器
 */
public class CpuObserver extends Observer{
    //传入目标类subject
    public CpuObserver(Server subject) {
        //初始化的时候完成数据双向绑定工作
        this.subject=subject;
        this.subject.addObserver(this);
    }
    @Override
    public void update() {
        //监听CPU的运行状况,负载超过80%就发出警报
        if(subject.getCpu() >= 80){
            System.out.println("警报:CPU当前" + subject.getCpu()+ "%即将满载,请 速查明原因");
        }
    }
}

观察者2 | 内存监听器

/**
 * @author linghu
 * @date 2024/7/4 12:46
 * 内存监听器
 */
public class MemoryObserver extends Observer{
    public MemoryObserver(Server subject) {
        this.subject=subject;
        this.subject.addObserver(this);
    }
    @Override
    public void update() {
        if(subject.getMemory() >= 80){
            System.out.println("警报:服务器内存已经占用超过" + subject.getMemory()+ "%即将满载,请 速查明原因");
        }
    }
}

客户端 | Client

/**
 * 观察者模式:让多个观察者对象同时监听某一个主题对象。
 * 这个主题对象在状态发生变化时,会通知所有观察者对象,
 * 使它们能够自动更新自己。
 * @author linghu
 * @date 2024/7/4 12:49
 * 客户端
 */
public class Client {
    public static void main(String[] args) throws InterruptedException {
        Server subject = new Server();
        //完成两个观察者和一个目标类的绑定
        //引入新的观察者,这里可以利用反射,动态加载~
        new CpuObserver(subject);
        new MemoryObserver(subject);
        //==============================
        while (true){
            int cpu=new Random().nextInt(100);
            int memory=new Random().nextInt(100);
            //调用具体的业务~
            subject.changeState(cpu,memory);
            Thread.sleep(5000);//5s
        }
    }
}

优点

  • 开闭原则。 你⽆需修改发布者代码就能引⼊新的订阅者类 (如果是发布者接⼝则可轻松引⼊发布者类)。
  • 你可以在运⾏时建⽴对象之间的联系。

适合场景

  • 所有的发布订阅模式
  • 构建事件监听机制,比如按下触发click事件


目录
相关文章
|
1天前
|
设计模式 Java
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
7 2
|
1天前
|
设计模式 算法 Java
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
5 0
|
1天前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
6 0
|
2月前
|
设计模式 存储 前端开发
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
文章详细介绍了观察者模式(Observer Pattern),这是一种对象行为型模式,用于建立对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文中通过交通信号灯与汽车的案例以及多人联机对战游戏的设计方案,阐述了观察者模式的动机和应用场景。接着,文章介绍了观察者模式的结构、角色、优点、缺点以及适用情况,并通过代码示例展示了如何在Java中实现观察者模式。此外,还探讨了观察者模式在MVC架构中的应用以及Java中对观察者模式的支持。
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
|
2月前
|
设计模式 Go
go 设计模式之观察者模式
go 设计模式之观察者模式
|
5月前
|
设计模式 Go
[设计模式 Go实现] 行为型~观察者模式
[设计模式 Go实现] 行为型~观察者模式
|
5月前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
设计模式 Java API
【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)
118 0
|
设计模式 前端开发 Java
【设计模式——学习笔记】23种设计模式——中介者模式Mediator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——中介者模式Mediator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
84 0
|
设计模式 算法
一文搞懂设计模式--工厂方法
一文搞懂设计模式--工厂方法
96 0