观察者模式由四个角色组成:抽象主题角色,抽象观察者角色,具体主题角色,抽象观察者角色,具体观察者角色。
抽象主题角色(Subject):把所有的观察者角色的引用保存在一个集合中,可以有任意数量的观察者。其提供一个接口,可以添加、删除观察者,并可以向登记过的观察者发送通知。
具体主题角色(Observer):实现了抽象主题角色提供的接口的一个具体类。
抽象观察者角色(ConcreteSubject):提供一个借口,以接收主题角色发送的通知。
具体观察者角色(ConcreteObserver):实现了抽象观察者角色提供的接口的一个具体类。
类图
JAVA代码:
package com.observer;import java.util.ArrayList;import java.util.List;/** * 抽象主题角色,被观察 * @author hyp * */public interface Subject{ void addWatcher(Watcher watcher); void removeWatcher(Watcher watcher); void notify(String message);}/** * 抽象观察者角色,观察主题 * @author hyp * */public interface Watcher{ void update(String message);}/** * 具体主题角色 * @author hyp * */public class ConcreteSubject implements Subject{ private Listwatchers = new ArrayList (); @Override public void addWatcher(Watcher watcher) { watchers.add(watcher); } @Override public void removeWatcher(Watcher watcher) { watchers.remove(watcher); } @Override public void notify(String message) { for(Watcher w:watchers) { w.update(message); } }}/** * 具体观察者橘色 * @author hyp * */public class ConcreteWatcher implements Watcher{ @Override public void update(String message) { System.out.println(this.toString()+ ":" + message); }}/** * 测试观察者模式 * @author hyp * */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.notify("Hello");//通知所有观察者 Subject.removeWatcher(watcher1);//移除一个观察者 Subject.notify("bye~"); }}