JAVA设计模式之观察者模式

观察者模式应用场景

在我们开发的过程中,经常会遇到一些当什么什么事情发生的时候,然后做什么什么事。比如某种商品的物价上涨时会导致部分商家高兴,而消费者伤心。

代码示例

抽象被观察者类
复制代码
package com.demo.test.observe.abs;

import java.util.ArrayList;
import java.util.List;

public abstract class Subject {
    private List<Observe> observeList = new ArrayList<>();

    public  void attach(Observe observe){
        this.observeList.add(observe);
    };
    public void detach(Observe observe){
        this.observeList.remove(observe);
    };

    public void allNotify(){
        for(Observe observe:observeList){
            observe.update();
        }
    }

}
抽象观察者类
复制代码
package com.demo.test.observe.abs;

public abstract class Observe {

    public abstract void update();

}
具体被观察者类
复制代码
package com.demo.test.observe;

import com.demo.test.observe.abs.Subject;

import java.util.List;

public class SubjectA extends Subject {


}
具体观察者1
复制代码
package com.demo.test.observe;


import com.demo.test.observe.abs.Observe;

public class StudentObserve extends Observe {

    public void update(){
        System.out.println("老师来了,快坐好");
    }
}
具体观察者2
复制代码
package com.demo.test.observe;

import com.demo.test.observe.abs.Observe;

public class StudentBObserve extends Observe {

    @Override
    public void update() {
        System.out.println("老师来了,别吃了");
    }
}
客户端
复制代码
package com.demo.test.observe;

import com.demo.test.observe.abs.Observe;
import com.demo.test.observe.abs.Subject;

public class Client {

    public static void main(String[] args){
       Subject subjectA =  new SubjectA();
       Observe studentObserve = new StudentObserve();

       subjectA.attach(studentObserve);
       subjectA.attach(new StudentBObserve());
       subjectA.allNotify();
    }
}

JAVA 自带的观察者类

被观察者
复制代码
package com.demo.test.observe.javaObserve;

import java.util.Observable;


public class Subject1 extends Observable {


    public void change(){
        setChanged(); //如果不执行setChanged,就不会调用update函数。
    }
}
观察者A
复制代码
package com.demo.test.observe.javaObserve;

import java.util.Observable;
import java.util.Observer;

public class ObserveA implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("java 自带观察者:A");
    }
}
观察者B
复制代码
package com.demo.test.observe.javaObserve;

import java.util.Observable;
import java.util.Observer;

public class ObserveB implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("java 自带观察者:B");
    }
}

客户端

复制代码
package com.demo.test.observe.javaObserve;


import java.util.Observable;
import java.util.Observer;

public class Client {

    public static void main(String[] args){
        Subject1 subject =  new Subject1();

        Observer observerA = new ObserveA();
        Observer observerB = new ObserveB();

        subject.addObserver(observerA);
        subject.addObserver(observerB);
//这一步主要调用里面的setChanged,否则update不执行。setChanged必须在Observable继承类内执行,因为它是protected修饰的。
        subject.change();
        subject.notifyObservers();
    }
}

© 著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务

喜欢的朋友记得点赞、收藏、关注哦!!!

相关推荐
金銀銅鐵34 分钟前
[Java] 一个方法最多可以有多少个入参?
java·jvm
哭哭啼1 小时前
JAVA服务问题诊断
java·开发语言·jvm
领创工作室1 小时前
GitHub Workflows 全面解析:从核心概念到开源实现
运维·github
evans在进步1 小时前
Spring Boot 核心机制详解:可执行 JAR、CORS、静态资源与配置绑定
spring boot·后端·jar
Sayuanni%31 小时前
SpringBoot 从注解到源码:核心知识点总结
java·spring boot·后端
吕海洋2 小时前
目前可用的docker源2026.08
运维·docker·容器
坚定信念,勇往无前2 小时前
Maven 私有仓库-nexus
java
Minner-Scrapy2 小时前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
晚风醉蝶2 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
夏天拐跑了西瓜2 小时前
Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战
java·spring cloud·微服务