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();
    }
}

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

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

相关推荐
雨中飘荡的记忆30 分钟前
ElasticJob分布式调度从入门到实战
java·后端
dkbnull8 小时前
深入理解Spring两大特性:IoC和AOP
spring boot
考虑考虑9 小时前
JDK25模块导入声明
java·后端·java ee
_小马快跑_10 小时前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
于眠牧北13 小时前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
Re_zero13 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记13 小时前
Spring Boot条件注解详解
java·spring boot
程序员清风1 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5511 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
洋洋技术笔记2 天前
Spring Boot配置管理最佳实践
spring boot