我的看法
-
- 其实现方式实际上为观察者定义统一的接口,便于主题的通知,而主题内维护了一个观察者列表,在列表上的观察者,主题发生变化的时候会遍历通知
- 实质上 观察者模式=出版者+订阅者(即被观察的主题发生变化会通知观察者)
应用场景
订阅号
swing组件的监听器
天气预报平台等
其中用到的设计原则
- 针对接口编程,而不针对实现
主题通过接口通知观察者,观察者的注册也是通过接口
- 多用组合,少用继承
对象之间的关系并没有使用继承,而是运行中通过组合产生
- 为交互对象设计松耦合
利用观察者模式我们将主题与观察者之间的耦合降低,在后期的维护和代码
复用都很方便,这样设计的系统更加有弹性
优点
使对象间的关系实现了松耦合,所以一边程序的变化不会影响另一边
主要组成
抽象主题 | 添加了对观察者列表维护的方法和通知的方法 |
具体主题 | 维护了一个观察者列表,并实现对观察者的通知 |
抽象观察者 | 所有观察者的抽象接口 |
具体观察者 | 实现了统一接口,并有收到通知的方法 |
类图
下面是我程序的类图
抽象主题
package observer_02;
public interface GirlSubject {
public void notifyBoy(String message);
public void deleteBoy(Object ob);
public void addBoy(Object ob);
}
具体主题(女孩)
package observer_02;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ContreteGirlSubject implements GirlSubject {
List observerList = new ArrayList();//观察者列表
public void notifyBoy(String message) {//发生变化时通知观察者
for (Iterator iterator = observerList.iterator(); iterator.hasNext();) {
BoyObserver boy = (BoyObserver) iterator.next();
boy.messDisplay(message);
}
}
public void deleteBoy(Object ob) {
int i = observerList.indexOf(ob);
if (i > 0)
observerList.remove(i);
}
public void addBoy(Object ob) {
observerList.add(ob);
}
}
抽象观察者
package observer_02;
public interface BoyObserver {
public void messDisplay(String message);
}
具体观察者(追求者A)
package observer_02;
public class HunterBoy implements BoyObserver {
private GirlSubject girlSubject;
public HunterBoy(GirlSubject girlSubject) {
this.girlSubject = girlSubject;
girlSubject.addBoy(this);//在初始化的时候将观察者注册进观察者列表
}
public void messDisplay(String message) {
System.out.println("HunterBoy is reading " + message);
}
}
具体观察者(追求者B)
package observer_02;
public class PursuerBoy implements BoyObserver {
GirlSubject girlSubject;
public PursuerBoy(GirlSubject girlSubject) {
this.girlSubject = girlSubject;
girlSubject.addBoy(this);
}
public void messDisplay(String message) {
System.out.println("PursuerBoy is reading " + message);
}
}
测试类
package observer_02;
public class Client {
public static void main(String[] args) {
GirlSubject girlSubject = new ContreteGirlSubject();
BoyObserver boy1 = new HunterBoy(girlSubject);
BoyObserver boy2 = new PursuerBoy(girlSubject);
girlSubject.notifyBoy("good day");
}
}
输出结果