设计模式-观察者模式

文章目录

观察者模式

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

观察者模式使用三个类: 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
相关推荐
残*影6 分钟前
Spring 中注入 Bean 有几种方式?
java·后端·spring
magic 24522 分钟前
Java设计模式:责任链模式
java·设计模式·责任链模式
我是苏苏1 小时前
C#基础:使用线程池执行并行任务
java·服务器·c#
风象南1 小时前
SpringBoot实现实时弹幕
java·spring boot·后端
编程、小哥哥2 小时前
互联网大厂Java求职面试实战:Spring Boot微服务架构及Kafka消息处理示例解析
java·spring boot·微服务·kafka·面试技巧
magic 2453 小时前
return this;返回的是谁
java·开发语言
sg_knight4 小时前
Eureka 高可用集群搭建实战:服务注册与发现的底层原理与避坑指南
java·spring boot·spring·spring cloud·微服务·云原生·eureka
数据潜水员9 小时前
C#基础语法
java·jvm·算法
你这个代码我看不懂10 小时前
Java项目OOM排查
java·开发语言
Zong_091510 小时前
AutoCompose - 携程自动编排【开源】
java·spring boot·开源·自动编排