观察者定义
观察者模式的定义,有多个对象在关注着一个对象,如果这个对象的状态发生了改变,其它依赖(关注)它的对象就会收到通知,然后在接收到通知以后各个对象做出相应的动作。这里涉及到两个概念(观察者和被观察者(目标类)),被观察者只能有一个,而观察这个观察者的对象可以用多个。【一对多】定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
何时使用观察者模式
1、触发联动:当修改目标状态时就会触发相应的通知,然后会循环调用所有注册的观察者对象的相应方法。
2、建议在下面三种情况下使用观察者模式:
- 1.当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化时
- 2.如果在封盖一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有对少对象需要被连带改变
- 3.当一个对象必须通知其他的对象,但是你又希望这个对象和其他被他通知的对象是松散耦合的
实现方式一:观察者模式 经典模版
观察者模式的结构:Subject(被观察者或者说是目标类):要有添加观察者,删除观察者,和提醒观察者(当被观察者的状态发生改变的时候调用这个方法)的方法,Observe(观察者):要有更新方法(当观察者状态发生改变调用提醒方法后观察者通过更新方法来做出不同响应(动作))。
ConcreteSubject是Subject接口的实现类
ConcreteObserver是Observer接口的实现类目标(被观察者):
/**
* 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
*/
public class Subject {
// 用来保存注册的观察者对象
private List<Observer> observers = new ArrayList<Observer>();
// attach detach notifyObservers
// 把订阅天气的人添加到订阅者列表中
public void attach(Observer observer) {
observers.add(observer);
}
/**
* 删除集合中的指定观察者
* @param observer
*/
public void detach(Observer observer) {
observers.remove(observer);
}
/**
* 通知所有注册的观察者对象
*/
protected void notifyObservers() {
for (Observer observer : observers) {
observer.update(this);
}
}
}
目标(被观察者)具体实现:
/**
* 具体的目标对象,负责把有关状态存入到相应的观察者对象中
*/
public class ConcreteSubject extends Subject {
// 目标对象的状态
private String Content;
public String getSubjectState() {
return Content;
}
public void setSubjectState(String Content) {
this.Content = Content;
// 内容有了,通知所有的订阅的人
this.notifyObservers();
}
}
观察者接口:
/**
* 这是一个观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象
*/
public interface Observer {
/**
* 更新的接口 传入目标对象,方便获取相应的目标对象的状态
* @param subject
*/
void update(Subject subject);
}
观察者接口的具体实现: