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

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

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

相关推荐
尽兴-4 分钟前
SQL 执行失败如何回滚?事务已提交还能恢复吗?——MySQL 误操作数据恢复全指南
sql·mysql·binlog·undolog·redolog
2501_940414087 分钟前
搞了一次平台工程,我把本地的 Docker Desktop 彻底卸了
运维·docker·容器
rabbit_pro11 分钟前
Java使用Mybatis-Plus封装动态数据源工具类
java·python·mybatis
期待のcode16 分钟前
Java虚拟机类加载机制
java·开发语言
heze0919 分钟前
sqli-labs-Less-6自动化注入方法
mysql·网络安全·自动化
看见繁华23 分钟前
Linux 交叉编译实践笔记
linux·运维·笔记
短剑重铸之日24 分钟前
《SpringBoot4.0初识》第四篇:原生镜像
java·原生镜像·springboot4.0
heze0924 分钟前
sqli-labs-Less-8自动化注入方法
mysql·网络安全·自动化
程序员欣宸27 分钟前
LangChain4j实战之十二:结构化输出之三,json模式
java·人工智能·ai·json·langchain4j
咕噜企业分发小米29 分钟前
直播云服务器安全防护有哪些最新的技术趋势?
运维·服务器·安全