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

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

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

相关推荐
以太浮标39 分钟前
华为eNSP模拟器综合实验之- ACL控制列表核心命令全解析及场景应用
运维·网络·网络协议·华为·信息与通信
巨斧空间掌门1 小时前
JDK17 下载 windows Linux
linux·运维·服务器
小挪号底迪滴1 小时前
Docker容器化实战:从“在我机器上能跑“到环境一致性
运维·docker·容器
短剑重铸之日1 小时前
《ShardingSphere解读》07 读写分离:如何集成分库分表+数据库主从架构?
java·数据库·后端·架构·shardingsphere·分库分表
知我Deja_Vu1 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
江畔何人初1 小时前
kube-apiserver、kube-proxy、Calico 关系
运维·服务器·网络·云原生·kubernetes
鸡蛋灌Bean2 小时前
MySQL优化系列
数据库·mysql
_下雨天.2 小时前
Nginx性能调优与深度监控
运维·nginx
daidaidaiyu2 小时前
Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)
java·spring
皮卡蛋炒饭.2 小时前
进程得控制
linux·运维·服务器