- 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。
- 比如,当一个对象被修改时,则会自动通知它的依赖对象。
- 观察者模式属于行为型模式。
意图
- 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决
- 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
案例
创建一个通知类,以及两个看电视的人,在电视开播或者停播的时候通知类对看电视人进行统一通知
1、定义通知类
package observer;
import java.util.ArrayList;
import java.util.List;
/**
* 通知类
*/
public class TvNotify {
//设置一个数组,用来装载被通知对象
List<AbstractWatcher> watcherList=new ArrayList<>();
//状态,同来设置通知的状态
private String state;
public String getState() {
return state;
}
//设置状态
public void setState(String state) {
this.state = state;
//之后进行通知
notifyAllWatchers();
}
//通知所有的看电视的人
public void notifyAllWatchers(){
for (AbstractWatcher watcher : watcherList) {
watcher.watchTv();
}
}
}
2、定义抽象看电视的人类
package observer;
public abstract class AbstractWatcher {
//这里使用protected代表的是可以被子类继承
protected TvNotify tvNotify;
public abstract void watchTv();
}
3、定义具体的看电视人
package observer;
public class Watcher1 extends AbstractWatcher{
//构造方法,在初始化的时候将通知类传入
public Watcher1(TvNotify tvNotify){
this.tvNotify=tvNotify;
//然后将对象传入通知类的通知数组中
this.tvNotify.watcherList.add(this);
}
//重写通知方法
@Override
public void watchTv() {
System.out.println("watcher1,电视剧《恶作剧之吻》"+tvNotify.getState());
}
}
package observer;
public class Watcher2 extends AbstractWatcher{
public Watcher2(TvNotify tvNotify){
this.tvNotify=tvNotify;
this.tvNotify.watcherList.add(this);
}
@Override
public void watchTv() {
System.out.println("watcher2,电视剧《恶作剧之吻》"+tvNotify.getState());
}
}
4、测试
package observer;
public class Test {
public static void main(String[] args) {
//1、定义通知类
TvNotify tvNotify = new TvNotify();
//2、初始化看电视的人
new Watcher1(tvNotify);
new Watcher2(tvNotify);
//设置状态并通知
tvNotify.setState("开播了");
tvNotify.setState("停播了");
}
}
//返回结果
watcher1,电视剧《恶作剧之吻》开播了
watcher2,电视剧《恶作剧之吻》开播了
watcher1,电视剧《恶作剧之吻》停播了
watcher2,电视剧《恶作剧之吻》停播了