观察者模式由四个角色组成:抽象主题角色,抽象观察者角色,具体主题角色,抽象观察者角色,具体观察者角色。
抽象主题角色(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 List<Watcher> watchers = new ArrayList<Watcher>(); @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~"); } }
时间: 2024-10-25 15:35:54