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 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu4 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h4 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了4 小时前
Java中的集合
java·开发语言
wjhx4 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
YCY^v^4 小时前
JeecgBoot 项目运行指南
java·学习
人间打气筒(Ada)4 小时前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd
爬山算法5 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
自不量力的A同学5 小时前
Solon AI v3.9 正式发布:全能 Skill 爆发
java·网络·人工智能
威迪斯特5 小时前
CentOS图形化操作界面:理论解析与实践指南
linux·运维·centos·组件·图形化·桌面·xserver