观察者模式

观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者
都会受到通知并自动更新。

SimpleSubject.java(SimpleSubject继承Observable)

import java.util.Observable;

public class SimpleSubject extends Observable {
	private int value = 0;
	
	public SimpleSubject() { }
	
	public void setValue(int value) {
		this.value = value;
		setChanged();
		notifyObservers(value);
	}
	
	public int getValue() {
		return this.value;
	}
}

SimpleObserver.java(SimpleObserver实现Observer接口)

import java.util.Observable;
import java.util.Observer;
	
public class SimpleObserver implements Observer {
	private int value;
	private Observable observable;
	
	public SimpleObserver(Observable observable) {
		this.observable = observable;
		observable.addObserver((Observer) this);
	}
	
	public void display() {
		System.out.println("Value: " + value);
	}

	@Override
	public void update(Observable o, Object arg) {
		System.out.println(arg);
		if (o instanceof SimpleSubject) {
			SimpleSubject simpleSubject = (SimpleSubject)o;
			this.value = simpleSubject.getValue();
			display();
		}
	}
}

运行

public class Example {

	public static void main(String[] args) {
		SimpleSubject simpleSubject = new SimpleSubject();
	
		SimpleObserver simpleObserver = new SimpleObserver(simpleSubject);

		simpleSubject.setValue(80);
	}
}
//结果
//80
//Value:80
//java源码notifyObservers实现
public void notifyObservers(Object arg) {
        Object[] arrLocal;
        synchronized (this) {
            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
}

问题

Observable将关键的方法保护起来

Observable中的setChanged()方法被保护起来了(被定义成protected)。除非你继承自Observable,否则你无法创建Observable实例并组合到你自己的对象中来。这个设计违反了第二个设计原则“多用组合,少用继承”。

发布了175 篇原创文章 · 获赞 62 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览