观察者模式Observer

1. 定义
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2. 结构图


Subject:目标对象,通常具有如下功能。
   一个目标可以被多个观察者观察。
   目标提供对观察者注册和退订的维护。
   当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者。
Observer:定义观察者的接口,提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,可以在这个方法里面回调目标对象,以获取目标对象的数据。
ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知所有注册的、有效的观察者,让观察者执行相应的处理。
ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,比如更新自身的状态以保持和目标的相应状态一致。

3. 本质
观察者模式的本质:触发联动。

4. Code Demo

Subject.java

package org.fool.observer;

public interface Subject {
	
	public void addWatcher(Watcher watcher);

	public void removeWatcher(Watcher watcher);
	
	public void notifyWatchers(String str);
}

ConcreteSubject.java

扫描二维码关注公众号,回复: 696568 查看本文章
package org.fool.observer;

import java.util.ArrayList;
import java.util.List;

public class ConcreteSubject implements Subject {

	private List<Watcher> list = new ArrayList<>();
	
	@Override
	public void addWatcher(Watcher watcher) {
		list.add(watcher);
	}

	@Override
	public void removeWatcher(Watcher watcher) {
		list.remove(watcher);
	}

	@Override
	public void notifyWatchers(String str) {
		for (Watcher watcher : list) {
			watcher.update(str);
		}
	}

}

Watcher.java

package org.fool.observer;

public interface Watcher {
	public void update(String str);
}

ConcreteWatcher.java

package org.fool.observer;

public class ConcreteWatcher implements Watcher {

	@Override
	public void update(String str) {
		System.out.println(str);
	}

}

Test.java

package org.fool.observer;

public class Test {
	public static void main(String[] args) {
		Subject subject = new ConcreteSubject();
		
		Watcher watcher1 = new ConcreteWatcher();
		Watcher watcher2 = new ConcreteWatcher();
		Watcher watcher3 = new ConcreteWatcher();
		
		subject.addWatcher(watcher1);
		subject.addWatcher(watcher2);
		subject.addWatcher(watcher3);
		
		subject.notifyWatchers("got 3 tickets");
		
		subject.removeWatcher(watcher2);
		
		subject.notifyWatchers("got 2 tickets, hurry");
	}
}

猜你喜欢

转载自agilestyle.iteye.com/blog/2273517