• java# 设计模式# 观察者模式 及应用场景


    观察者模式

    观察者模式分为两端,观察者与被观察者。观察者实现接收通知接口。被观察者实现添加观察者,添加,调用通知接口。两者关系为一对多。被观察者一,观察者多。

    应用场景

    观察者模式,多应用于一对多的业务逻辑。且观察者与被观察者不会产生交集。使用观察者模式后方便观察者与被观察者解耦。

    代码示例

    // 观察者接口
    public interface Observer {
    	public void update(String message);
    }
    // 观察者实现(多)
    public class ConcreteObserver implements Observer {
    	private String name;
    	private String message;
    	public ConcreteObserver(String name) {
    		this.name = name;
    	}
    	@Override
    	public void update(String message) {
    		this.message = message;
    		this.read();
    	}
    	public void read() {
    		System.out.println(name + "收到消息:" + message);
    	}
    }
    // 被观察者接口
    public interface Subject {
    	/**
    	 * @param o 观测者
    	 * @return void
    	 * @Description 注册观察者
    	 **/
    	public void registerObserver(Observer o);
    	/**
    	 * @param o 观察者
    	 * @return void
    	 * @Description 删除观察者
    	 **/
    	public void removeObserver(Observer o);
    	/**
    	 * @param
    	 * @return void
    	 * @Description 通知观察这
    	 **/
    	public void notifyObserver();
    }
    // 被观察者实现(一)
    public class ConcreteSubject implements Subject {
    
    	private Vector<Observer> observers;
    
    	private String message;
    
    	public ConcreteSubject() {
    		observers = new Vector<>();
    	}
    
    	@Override
    	public void registerObserver(Observer o) {
    		observers.add(o);
    	}
    
    	@Override
    	public void removeObserver(Observer o) {
    		if (!observers.isEmpty()) {
    			observers.remove(o);
    		}
    	}
    
    	@Override
    	public void notifyObserver() {
    		for (Observer observer : observers) {
    			observer.update(message);
    		}
    	}
    
    	public void send(String message) {
    		this.message = message;
    		this.notifyObserver();
    	}
    }
    

    扩展

    在 java.util.Observer 中有现成的观察者模式。但被观察者java.util.Observable 中的观察者集合用的是Vector。涉及线程安全问题.如被观察者会涉及线程安全问题。建议使用Vector.

    java.util.Observable 有意思的地方在于 接收通知时,将被观察者对象直接传给了观察者。

  • 相关阅读:
    七言丨做个俗人,浪荡一生,干净自由。
    当你无法原谅父母时,那就不要原谅
    node_modules干什么的?
    流的操作(一)视频转音频引发的血案
    OpenGL ES 压缩纹理
    用 .SqlSugar ORM 来实现报表功能 .NET CORE /.NET
    Opencv 播放mp4文件和读取摄像头图以及可能会发生的一些异常问题解决方法
    Vue 前端权限控制的优化改进版
    输入框占位符placeholder
    为DOM节点添加或者删除class
  • 原文地址:https://www.cnblogs.com/xy-c/p/14240185.html
Copyright © 2020-2023  润新知