目录
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
一、模式含义
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式的别名:包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式是一种对象行为型模式。
1.1Subject(目标):
目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。目标类可以是接口,也可以是抽象类或具体类。
1.2ConcreteSubject(具体目标):
具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。如果无须扩展目标类,则具体目标类可以省略。
1.3Observer(观察者):
观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
1.4ConcreteObserver(具体观察者):
在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的集合中或通过detach()方法将自己从目标类的集合中删除
二、示例代码
2.1Subject(目标):
package com.yan.pattern.observer.define;
public interface Subject {
public void addLisener(Observer o);
public void removeLisener(Observer o);
public void notiseObservers();
}
2.2ConcreteSubject(具体目标):
package com.yan.pattern.observer.define;
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject{
List<Observer> lists = new ArrayList<Observer>();
public void addLisener(Observer o) {
lists.add(o);
}
public void removeLisener(Observer o) {
lists.remove(o);
}
private String message;
public void setMessage(String message) {
this.message = message;
notiseObservers();
}
public void notiseObservers() {
for(Observer observer : lists) {
observer.showMessage(message);
}
}
}
2.3Observer(观察者):
package com.yan.pattern.observer.define;
public abstract class Observer {
public abstract void showMessage(String message);
}
2.4ConcreteObserver(具体观察者):
package com.yan.pattern.observer.define;
public class CatObserver extends Observer{
public void showMessage(String message) {
System.out.println("我是猫观察者,我接收了:" + message);
}
}
package com.yan.pattern.observer.define;
public class DogObserver extends Observer{
public void showMessage(String message) {
System.out.println("我是狗观察者,我接收了:" + message);
}
}
2.5Client(模拟客户端使用观察者模式):
package com.yan.pattern.observer.define;
public class Client {
public static void main(String[] args) {
ConcreteSubject observable = new ConcreteSubject();//能被观察的
Observer observer = new CatObserver();//观察者
observable.addLisener(observer);
Observer observer2 = new DogObserver();
observable.addLisener(observer2);
observable.setMessage("我是能被观察的 消息");
System.out.println("---------------------");
observable.removeLisener(observer);
observable.setMessage("我又更新了新消息");
}
}