目录
一、观察者模式的定义
定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
二、类图
三、例子
场景:你开通了一个天气预报频道(主题),最近涨了两个粉丝(观察者),你发布了最近的天气信息,他们就能看到发布的消息,如果取消关注,就看不到了,看看怎么实现
1、主题角色
/**
* 主题接口
*/
public interface Subject {
// 注册观察者
public void registerObserver(Observer o);
// 移除观察者
public void removeObserver(Observer o);
// 发布消息,通知观察者
public void notifyObservers(String msg);
}
2、观察者角色
/**
* 观察者接口
*/
public interface Observer {
public void update(String msg);
}
3、主题实现类
/**
* 主题实现类
*/
public class WeatherChannel implements Subject {
private String name;
private ArrayList<Observer> observers;
public WeatherChannel(String name) {
this.name = name;
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
System.out.println(o.toString() + " 关注了" + name);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(o);
}
System.out.println(o.toString() + " 取消关注" + name);
}
@Override
public void notifyObservers(String msg) {
System.out.println("发布消息:" + msg);
for (Observer o : observers) {
o.update(msg);
}
}
}
4、观察者实现类
/**
* 观察者实现类
*
*/
public class WeatherFans implements Observer {
private String name;
public WeatherFans(String name) {
this.name = name;
}
@Override
public void update(String msg) {
System.out.println(this.name + " 收到消息:" + msg);
}
@Override
public String toString() {
return this.name;
}
}
5、测试
public class ObserverTest {
public static void main(String[] args) {
//创建'天气预报频道'主题实例
Subject subject = new WeatherChannel("[天气预报频道]");
//创建两个粉丝
Observer observer1 = new WeatherFans("粉丝1号");
Observer observer2 = new WeatherFans("粉丝2号");
//粉丝关注主题
subject.registerObserver(observer1);
subject.registerObserver(observer2);
//主题发布消息
subject.notifyObservers("2018-12-03天气降温,注意保暖哦!");
//移除粉丝1号
subject.removeObserver(observer1);
//主题再次发布消息
subject.notifyObservers("明天天气将持续低温,注意别感冒哦!");
}
}
结果:
粉丝1号 关注了[天气预报频道]
粉丝2号 关注了[天气预报频道]
发布消息:2018-12-03天气降温,注意保暖哦!
粉丝1号 收到消息:2018-12-03天气降温,注意保暖哦!
粉丝2号 收到消息:2018-12-03天气降温,注意保暖哦!
粉丝1号 取消关注[天气预报频道]
发布消息:明天天气将持续低温,注意别感冒哦!
粉丝2号 收到消息:明天天气将持续低温,注意别感冒哦!
文章内容参考:Head First设计模式 第2章 观察者模式,上面的例子做了简单的修改,大家如有不同的想法,可以讨论讨论,共同进步