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

文章目录

定义

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

结构

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

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

Demo | 代码

Subject目标类

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

  • Subject被观察的目标
  • Observer观察者抽象类
  • 具体观察者实现类
  • Client客户端
java 复制代码
/**
 * 这个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抽象观察者

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

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

观察者1 | CPU监听器

java 复制代码
/**
 * @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 | 内存监听器

java 复制代码
/**
 * @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

java 复制代码
/**
 * 观察者模式:让多个观察者对象同时监听某一个主题对象。
 * 这个主题对象在状态发生变化时,会通知所有观察者对象,
 * 使它们能够自动更新自己。
 * @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事件
相关推荐
simple_whu1 小时前
开启WSL的镜像网络模式
windows·wsl
周努力.2 小时前
设计模式之中介者模式
设计模式·中介者模式
modest —YBW5 小时前
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
人工智能·windows·docker·语言模型·llama
code在飞5 小时前
windows 部署 Kafka3.x KRaft 模式 不依赖 ZooKeeper
windows·分布式·zookeeper·kafka
不会飞的鲨鱼7 小时前
Windows系统下使用Kafka和Zookeeper,Python运行kafka(二)
windows·zookeeper·kafka
2501_9153738816 小时前
Electron 打包与发布指南:让你的应用运行在 Windows、macOS、Linux
windows·macos·electron
yangyang_z17 小时前
【C++设计模式之Template Method Pattern】
设计模式
源远流长jerry18 小时前
常用设计模式
设计模式
z263730561118 小时前
六大设计模式--OCP(开闭原则):构建可扩展软件的基石
设计模式·开闭原则
01空间1 天前
设计模式简述(十八)享元模式
设计模式·享元模式