观察者模式的定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新
类似于发布订阅,订阅了主题对象的改动信息,自己则受到通知并作出自己的应对
原理图:
具体实现:
定义观察者接口:观察者定义一个收到被观察对象改变时调用的方法
package pers.ly.learn.designModel.observer;
public interface IObserver {
public void change(String info);
}
定义观察者实现类:
package pers.ly.learn.designModel.observer;
public class Observer implements IObserver {
private String name;
public Observer(String name) {
super();
this.name = name;
}
@Override
public void change(String info) {
System.out.println("观察者:" + this.name +"收到Subject改动信息:" + info +" 正在做出应对...");
}
}
定义一个主题接口:该主题支持新增观察者,删除观察者,和通知观察者三个方法
package pers.ly.learn.designModel.observer;
public interface ISubject {
void addObserver(IObserver obsr);
void removeObserver(IObserver obsr);
void notifyObserver();
}
定义主题接口实现类:该实现类中定义observers 集合保存观察者/删除对象,调用观察者change方法则可通知观察者,info则是通知观察者的消息
package pers.ly.learn.designModel.observer;
import java.util.ArrayList;
import java.util.List;
public class Subject implements ISubject {
private List<IObserver> observers = new ArrayList<IObserver>();
private String info;
@Override
public void addObserver(IObserver obsr) {
observers.add(obsr);
}
@Override
public void removeObserver(IObserver obsr) {
if(observers.contains(obsr)) {
observers.remove(obsr);
}
}
@Override
public void notifyObserver() {
if(!observers.isEmpty() && observers.size()>0) {
for (IObserver iObserver : observers) {
iObserver.change(info);
}
}
}
public void change(String info) {
this.info = info;
System.out.println("Subject对象change方法被调用:" + info);
notifyObserver();
}
}
测试代码:
package pers.ly.learn.designModel.observer;
public class Test {
public static void main(String[] args) {
Observer o1 = new Observer("O1");
Observer o2 = new Observer("O2");
Observer o3 = new Observer("O3");
Subject su =new Subject();
su.addObserver(o1);
su.addObserver(o2);
su.addObserver(o3);
su.change("今晚加班!");
su.removeObserver(o3);
su.change("明晚不加班!");
}
}