当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
分为四个角色:
抽象被观察者
注册观察者的方法
取消观察者的方法
通知观察者的方法
抽象观察者
更新状态的方法
具体被观察者角色
发布消息的方法
具体观察者角色
/**
* 抽象被观察者主题
* @author XXJ
*
* 2019年3月2日 下午3:38:48
*/
public abstract class AbstractSubject {
//定义观察者列表
private List<Observer> list = new ArrayList<Observer>();
//注册观察者方法
public void addObserver(Observer observer) {
list.add(observer);
}
//取消观察者方法
public void removeObserver(Observer observer){
list.remove(observer);
}
//通知观察者方法
public void notifyObserver(String info){
for (Observer ob : list) {
ob.update(info);
}
}
//发布消息的方法
public abstract void publish(String message);
}
/**
* 抽象观察者
* @author XXJ
*
* 2019年3月2日 下午3:44:11
*/
public interface Observer {
//更新状态的方法
void update(String info);
}
/**
* 具体被观察者
* @author XXJ
*
* 2019年3月2日 下午3:44:38
*/
public class NewsSubject extends AbstractSubject {
@Override
public void publish(String message) {
System.out.println("开始推送新闻......");
//通知观察者
notifyObserver(message);
}
}
public class NewsObserver implements Observer {
public NewsObserver(AbstractSubject sub){
//订阅主题
sub.addObserver(this);
}
@Override
public void update(String info) {
System.out.println("已接收新闻:" + info);
}
}
public class Test {
public static void main(String[] args) {
AbstractSubject subject = new NewsSubject();
Observer ob = new NewsObserver(subject);
subject.publish("杭州房价上涨了");
}
}