设计模式-观察者模式

文章目录

观察者模式

也称为订阅---发布模式,在此模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用在事件处理系统。

观察者模式使用三个类: Subject(被观察的主体)、Observer(观察者) 和 测试类

Subject的操作会通知所有注册的Observer,Subject可以添加删除Observer

  • Subject
java 复制代码
import java.util.List;
import java.util.Vector;

/**
 * 被观察主体
 * @Author mubi
 * @Date 2020/6/17 09:27
 */
public class Subject {
    // 观察者
    private List<Observer> observers = new Vector<>();
    // 观察主体的状态变化
    private int state;

    public int getState() {
        return state;
    }
	
	/**
	自身状态变化后,通知所有的观察者
	*/
    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }

    public void addObserver(Observer observer){
        observers.add(observer);
    }

    public void delObserver(Observer observer){
        observers.remove(observer);
    }

    public void notifyAllObservers(){
        // 通知观察者,不同观察者执行不同的事情
        for (Observer observer : observers) {
            observer.update();
        }
    }
}
  • Observer 抽象类
java 复制代码
/**
 * @Author mubi
 * @Date 2020/6/17 09:27
 */
public abstract class Observer {
    protected Subject subject;

    public abstract void update();
}
  • 具体的Observer类
java 复制代码
/**
 * @Author mubi
 * @Date 2020/6/17 09:27
 */
public class BinaryObserver extends Observer {

    public BinaryObserver(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void update() {
        System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
    }
}
java 复制代码
/**
 * @Author mubi
 * @Date 2020/6/17 09:28
 */
public class OctalObserver extends Observer {

    public OctalObserver(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void update() {
        System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
    }
}
  • 测试
java 复制代码
/**
 * @Author mubi
 * @Date 2020/6/17 09:32
 */
public class DesignTest {

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

        Observer observer1 = new BinaryObserver(subject);
        Observer observer2 = new OctalObserver(subject);

        subject.addObserver(observer1);
        subject.addObserver(observer2);

        subject.setState(10);
        System.out.println();

        subject.setState(12);
        System.out.println();

        subject.delObserver(observer1);

        subject.setState(13);
        System.out.println();
    }
}

输出:

java 复制代码
Binary String: 1010
Octal String: 12

Binary String: 1100
Octal String: 14

Octal String: 15 // 因为此前删除了 BinaryObserver
相关推荐
我真的是大笨蛋33 分钟前
K8S-Pod(下)
java·笔记·云原生·容器·kubernetes
碳水加碳水1 小时前
Java代码审计实战:XML外部实体注入(XXE)深度解析
java·安全·web安全·代码审计
TechNomad2 小时前
设计模式:状态模式(State Pattern)
设计模式·状态模式
努力也学不会java2 小时前
【设计模式】 原型模式
java·设计模式·原型模式
方渐鸿2 小时前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署
学亮编程手记2 小时前
K8S v1.33 版本主要新特性介绍
java·容器·kubernetes
Haven-4 小时前
Java-面试八股文-JVM篇
java·jvm·面试
我真的是大笨蛋4 小时前
JVM调优总结
java·jvm·数据库·redis·缓存·性能优化·系统架构
wjs0404 小时前
Git常用的命令
java·git·gitlab
superlls4 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法