一、解释说明:
1、被观察者
主要包含:被观察者集合、注册观察者方法、删除观察者方法、通知观察者方法。
2、观察者接口
主要包含:定义事件触发的业务处理方法接口。
3、观察者实现
主要包含:定义事件触发的业务处理方法实现。
4、客户端
主要调用步骤:
1)创建被观察者对象
2)创建观察者对象
3)把观察者对象注册到被观察者中
4)被观察者触发事件
二、案例代码
用例图
1、被观察者代码如下
package 观察者模式;
import java.util.ArrayList;
import java.util.List;
//气象台
public class Observed {
private float temprature;//温度
private float pressure;//压强
private List<Observer> observerList;//观察者集合
//初始化观察者集合
public Observed(){
observerList = new ArrayList<Observer>();
}
//设置天气预报
void setData(float temprature,float pressure){
this.temprature = temprature;
this.pressure = pressure;
notifyObserver();
}
//注册观察者
public void registerOberver(Observer observe){
observerList.add(observe);
}
//删除观察者
public void delObserver(Observer observer){
if(observerList.contains(observer)){
observerList.remove(observer);
}
}
//通知观察者
public void notifyObserver(){
for (Observer observer : observerList){
observer.display(this.temprature,this.pressure);
}
}
}
2、观察者接口代码如下
package 观察者模式;
public interface Observer {
//获取天气预报
void display(float temprature, float pressure);
}
3、观察者
1)百度观察者代码如下
package 观察者模式;
//百度观察者
public class BaiduOberver implements Observer {
@Override
public void display(float temprature, float pressure) {
System.out.println("百度天气预报温度是:"+temprature+" 百度天气预报气压是:"+pressure);
}
}
2)新浪观察者代码如下
package 观察者模式;
//新浪观察者
public class XinLObserver implements Observer{
@Override
public void display(float temprature, float pressure) {
System.out.println("新浪天气预报温度是:" + temprature + " 新浪天气预报气压是:" + pressure);
}
}
4、客户端代码如下
package 观察者模式;
public class Client {
public static void main(String[] args) {
//创建气象站被观察者对象
Observed observed = new Observed();
//创建百度观察者对象
Observer baiduOberver = new BaiduOberver();
//创建新浪观察者对象
XinLObserver xinLObserver = new XinLObserver();
//把百度观察者对象注册到气象站被观察者对象中
observed.registerOberver(baiduOberver);
//把百度观察者对象注册到气象站被观察者对象中
observed.registerOberver(xinLObserver);
//气象站发布天气预报
observed.setData(100f,300f);
}
}
三、使用场景
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
四、优缺点
1、优点
1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
2)观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,
2、缺点
1)如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。
3)如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。