觀察者模式:
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
自己的理解:觀察者模式相當於書刊==》訂閱者這種類型,比如說:我訂閱了一本《讀者》,然後讀者每發行一版就會給我發送一次新的週刊。
類圖:(上一個策略模式的類圖是自己隨意畫的,很不好,還是找的一個,看來以後的將UML也學習一番了。)
下面我們來看代碼:
主題接口:
public interface Subject {
void addObserver(Observer obs);
void removeObserver(Observer obs);
void notifyObserver();
}
主題接口設計三個方法:
一個爲註冊觀察者方法addObserver(Observer obs),一個爲 註銷觀察者方法:removeObserver(Observer obs);最後一個爲提醒觀察者:notifyObserver();
主題實現類:
public class ConcreteSubject implements Subject {
private String state = "this is ConcreteSubject state";
private List<Observer> observerList=new ArrayList<Observer>();
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public void addObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.add(obs);
}
@Override
public void removeObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.remove(obs);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for (Observer obs: observerList) {
obs.action(state);
}
}
}
抽象觀察者:
public interface Observer {
void action(String state);
}
抽象觀察者主要用於執行觀察者的共同方法
實例觀察者:
public class ConcreteObserver implements Observer {
@Override
public void action(String state) {
// TODO Auto-generated method stub
System.out.println(state);
}
}
實例觀察者用來實現相應的方法。
下面我們來看實現代碼:
public class ObserverTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteSubject sub = new ConcreteSubject();
Observer observer = new ConcreteObserver();
sub.addObserver(observer);
sub.notifyObserver();
sub.setState("this is the changed");
sub.notifyObserver();
sub.removeObserver(observer);
sub.notifyObserver();
}
}
開始的時候,我們提到書刊訂閱,這種是書刊主動推送,如果讀者想自己取是不是會更好呢?觀察者模式中恰好就有這種類型。我們一般將上面的例子稱爲推模式,而接下來的這種稱爲拉模式。代碼如下:
主題接口:
public interface Subject {
void addObserver(Observer obs);
void removeObserver(Observer obs);
void notifyObserver();
}
主題接口設計三個方法:
一個爲註冊觀察者方法addObserver(Observer obs),一個爲 註銷觀察者方法:removeObserver(Observer obs);最後一個爲提醒觀察者:notifyObserver();
主題實現類:
public class ConcreteSubject implements Subject {
private String state = "this is ConcreteSubject state";
private List<Observer> observerList=new ArrayList<Observer>();
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public void addObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.add(obs);
}
@Override
public void removeObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.remove(obs);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for (Observer obs: observerList) {
obs.action(this);
}
}
}
抽象觀察者:
public interface Observer {
void action(ConcreteSubject concreteSubject );
}
抽象觀察者主要用於執行觀察者的共同方法
實例觀察者:
public class ConcreteObserver implements Observer {
@Override
public void action(ConcreteSubject concreteSubject) {
// TODO Auto-generated method stub
System.out.println(concreteSubject.getState());
}
}
實例觀察者用來實現相應的方法。
下面我們來看實現代碼:
public class ObserverTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteSubject sub = new ConcreteSubject();
Observer observer = new ConcreteObserver();
sub.addObserver(observer);
sub.notifyObserver();
sub.setState("this is the changed");
sub.notifyObserver();
sub.removeObserver(observer);
sub.notifyObserver();
}
}
ok,今天的分享就到這裏了。
另外,java內部也有觀察者模式的相關類,大家可以網上查相關資料,我這裏就不贅述了。
歡迎大家來拍磚,有什麼好的建議也可以留言,大家一起學習哈。。。