定义
基于事件和响应的设计模式
简单来说多个观察者同时观察一个对象,当对象发生变化的时候观察者能够回调自身的方法更新自己。
1. 定义一个观察者接口
2. 观察者实现观察者接口
3. 定义被观察者接口或者抽象类,里面有addObserver(Observer observer),removeObserver(Observer observer),notifyObserver(),调用notifyObserver(),遍历list<Observer>, 回调onserver里面的方法。
经典的例子
游戏中英雄,在地图中中走,捡宝盒增加技能或者踩到陷阱减生命力的。
在这个例子中,宝石,宝剑和陷阱属于观察者ConcreteObserver,英雄属于被观察者,
如何建立关系呢?
首先有很多的英雄和很多的道具,抽取共同的行为
Public interface Observer{
void update();
}
宝石
public Stone implement Observer{
public void update(){
if(inrange()){
System.out.print("获取到宝石");
}
}
public Boolean inrange(){
//判断是否在距离内
return true;
}
}
陷阱
public Trap implement Observer{
public void update(){
if(){
System.out.print("踩到陷阱");
}
}
}
定义抽象类
public abstract Subject{
private List<Observer> observerList = new ArrayList<Observer>();
public void addObserver(Observer observer){
observerList.add(observer);
}
public void deleteObserver(Observer observer){
observerList.remove(observer);
}
public void notifyObserver(){
for(Observer observer: observerList){
observer.update();
}
}
}
定义英雄
public class Hero extend Subject{
public void run(){
notifyObserver();
}
}
具体调用
```
public class client{
public static void main(String[] args){
//初始化对象
Hero hero = new Hero();
Stone stone = new Stone();
Trap trap = new Trap();
hero.addObserver(stone);
hero.addObserver(trap);
hero.run();
}
}
代码输出如下:
获取到宝石
踩到陷阱
```
优缺点
- 解耦观察者被观察者