本文中应用到的github源码地址:https://github.com/Sunshine-lhy/Observer
一、观察者模式概述
首先,观察者模式在百度百科上的定义如下:
观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
阎宏博士的《JAVA与模式》一书中开头是这样描述观察者(Observer)模式的:
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
(1)Subject模块
Subjec模块有3个主要操作
addObserver():注册添加观察者(申请订阅)
deleteObserver():删除观察者(取消订阅)
notifyObserver():主题状态发生变化时通知所有的观察者对象
(2)Oserver模块
Oserver模块有1个核心操作update(),当主题Subject状态改变时,将调用每个观察者的update()方法,更新通知。
(3)UML图
二、代码实例
观察者代码
public class Client {
public static void main(String[] args){
// 创建目标
CreateWeatherSubject weather=new CreateWeatherSubject();
// 创建观察者
CreateWeatherObserver observerGirl=new CreateWeatherObserver();
observerGirl.setObserverName("媳妇");
observerGirl.setRemindThing("我们的第一次约会");
CreateWeatherObserver observerMum=new CreateWeatherObserver();
observerMum.setObserverName("mama");
observerMum.setRemindThing("是个购物的好诶子,记得扫货");
// 注册观察者
weather.attach(observerGirl);
weather.attach(observerMum);
// 目标
weather.setWeatherContent("明天天气晴朗,蓝天白云,气温28°");
}
}
Oserver模块
具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致
public class CreateWeatherObserver implements WeatherObserver{
//观察者的名字
private String observerName;
//天气的内容情况
private String weatherContent;
//被观察者要提醒的内容
private String remindThing;
public String getObserverName() {
return observerName;
}
public void setObserverName(String observerName) {
this.observerName = observerName;
}
public String getWeatherContent() {
return weatherContent;
}
public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
}
public String getRemindThing() {
return remindThing;
}
public void setRemindThing(String remindThing) {
this.remindThing = remindThing;
}
@Override
//获取目标类的状态要同步到观察者的状态中
public void update(WeatherSubject subject) {
// TODO Auto-generated method stub
weatherContent=((CreateWeatherSubject)subject).getWeatherContent();
System.out.println(observerName+":"+weatherContent+","+remindThing);
}
}
Subject模块
具体的目标对象,负责吧有关状态存入到相应的观察者对象中
public class CreateWeatherSubject extends WeatherSubject{
//获取天气的内容信息
private String weatherContent;
public String getWeatherContent() {
return weatherContent;
}
public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
//内容有了,说明天气更新了,通知所有订阅天气的人
this.notifyObservers();
}
}
这是一个观察者接口,定义一个更新的接口给那些目标发生改变的时候被通知的对象
public interface WeatherObserver {
public void update(WeatherSubject subject);
}
目标对象,他知道观察他的观察者,并提供添加和删除观察者的接口
import java.util.ArrayList;
import java.util.List;
public class WeatherSubject {
//用于保存注册的观察者对象
private List<WeatherObserver> observers =new ArrayList<WeatherObserver>();
//把观察者添加到观察者集合中
public void attach(WeatherObserver observer){
observers.add(observer);
}
//删除观察者集合中指定的观察者.
public void detach(WeatherObserver observer){
observers.remove(observer);
}
//通知方法,需要通知观察者列表中的所有观察者.
protected void notifyObservers(){
for(WeatherObserver observer : observers){
//把当前具体被观察者对象传入到update参数中,以便在update()方法中获取被观察者的状态信息.
observer.update(this);
} }
}
参考资料:
https://blog.csdn.net/chengyuqiang/article/details/79222294
https://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html