一、简介
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
二、代码实例
package weather;
import java.util.ArrayList;
import java.util.List;
public class WeatherSubject {
private List<Observer> observers=new ArrayList<Observer>();
//把订阅天气的人添加到订阅者列表中
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
protected void notifyObservers(){
for(Observer observer:observers){
observer.update(this);
}
}
}
package weather;
public class ConcreteWeatherSubject extends WeatherSubject{
private String weatherContent;
public String getWeatherContent() {
return weatherContent;
}
public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
//通知多有的订阅者
this.notifyObservers();
}
}
package weather;
import com.Subject;
public interface Observer {
public void update(WeatherSubject weatherSubject);
}
package weather;
import com.ConcreteSubject;
import com.Subject;
public class ConcreteObserver implements Observer{
private String observerName;
private String observerContent;
private String remindThing;
//获取目标类的状态同步到观察者的状态中
@Override
public void update(WeatherSubject weatherSubject) {
observerContent = ((ConcreteWeatherSubject)weatherSubject).getWeatherContent();
System.out.println(observerName+"收到了"+observerContent+","+remindThing);
}
public String getObserverName() {
return observerName;
}
public void setObserverName(String observerName) {
this.observerName = observerName;
}
public String getObserverContent() {
return observerContent;
}
public void setObserverContent(String observerContent) {
this.observerContent = observerContent;
}
public String getRemindThing() {
return remindThing;
}
public void setRemindThing(String remindThing) {
this.remindThing = remindThing;
}
}
package weather;
public class Client {
public static void main(String[] args) {
//1.创建目标
ConcreteWeatherSubject weather=new ConcreteWeatherSubject();
//2.创建观察者
ConcreteObserver observerGirl=new ConcreteObserver();
observerGirl.setObserverName("小明的女朋友");
observerGirl.setObserverContent("是我们的第一次约会,地点万达广场,不见不散!");
ConcreteObserver observerMun=new ConcreteObserver();
observerMun.setObserverName("老妈");
observerMun.setObserverContent("是一个购物的好日子");
//3.注册观察者
weather.attach(observerGirl);
weather.attach(observerMun);
//4.目标发布天气
weather.setWeatherContent("明天天气晴朗,蓝天白云,气温28度");
}
}