基本介紹
觀察者模式:對(duì)象之間多對(duì)一依賴的一種設(shè)計(jì)方案建丧,被依賴的對(duì)象為Subject,依賴的對(duì)象為Observer, Subject通 知Observer變化,Subject,是一的一方蹋订。 用戶是Observer, 是多的一方布讹。
例子:
天氣預(yù)報(bào)項(xiàng)目需求,具體要求如下:
- 氣象站可以將每天測量到的溫度琳拭,顯度,氣壓等等以公告的形式發(fā)布出去(比如
發(fā)布到自己的網(wǎng)站或第三方)描验。 - 需要設(shè)計(jì)開放型API,便于其他第三方也能接入氣象站獲取數(shù)據(jù)白嘁。
- 提供溫度、氣壓和濕度的接口
- 測量數(shù)據(jù)更新時(shí)膘流,要能實(shí)時(shí)的通知給第三方
public interface Observer {
void update(float a,float b,float c);
}
public interface Subject {
void register(Observer observer);
void remove(Observer observer);
void notifyObservers();
}
public class WeatherData implements Subject{
float a;
float b;
float c;
List<Observer> observers;
public WeatherData() {
this.observers = new ArrayList<Observer>();
}
@Override
public void register(Observer observer) {
// TODO Auto-generated method stub
observers.add(observer);
}
@Override
public void remove(Observer observer) {
// TODO Auto-generated method stub
if (observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notifyObservers() {
// TODO Auto-generated method stub
for(Observer observer : observers){
observer.update(a, b, c);
}
}
public void setData(float a,float b,float c){
this.a = a;
this.b = b;
this.c = c;
notifyObservers();
}
}
public class Baidu implements Observer{
float a;
float b;
float c;
@Override
public void update(float a, float b, float c) {
// TODO Auto-generated method stub
this.a=a;
this.b=b;
this.c =c;
display();
}
private void display() {
// TODO Auto-generated method stub
System.out.println("a指標(biāo)為:"+a);
System.out.println("b指標(biāo)為:"+b);
System.out.println("c指標(biāo)為:"+c);
}
}
public class Client {
public static void main(String[] args) {
WeatherData subject = new WeatherData();
Observer baidu = new Baidu();
subject.register(baidu);
subject.setData(1,2,3);
System.out.println("=============指標(biāo)進(jìn)行了更新===========");
subject.setData(4,5,6);
}
}
觀察者模式的好處
- 觀察者模式設(shè)計(jì)后絮缅,會(huì)以集合的方式來管理用戶(Observer), 包括注冊(cè)呼股,移除和通知盟蚣。
- 這樣,我們?cè)黾佑^察者(這里可以理解成一一個(gè)新的公告板)卖怜,就不需要去修改核心類WeatherData不會(huì)修改代碼屎开,遵守了ocp原則。