觀察者設計模式定義了對象間的一種一對多的組合關系,以便一個對象的狀态發生變化時,所有依賴于它的對象都得到通知并自動重新整理。
釋出者釋出資訊,訂閱者擷取資訊,訂閱了就能收到資訊,沒訂閱就收不到資訊。
抽象被觀察者角色:也就是一個抽象主題,它把所有對觀察者對象的引用儲存在一個集合中,每個主題都可以有任意數量的觀察者。抽象主題提供一個接口,可以增加和删除觀察者角色。一般用一個抽象類和接口來實作。
抽象觀察者角色:為所有的具體觀察者定義一個接口,在得到主題通知時更新自己。
具體被觀察者角色:也就是一個具體的主題,在集體主題的内部狀态改變時,所有登記過的觀察者發出通知。
具體觀察者角色:實作抽象觀察者角色所需要的更新接口,一邊使本身的狀态與制圖的狀态相協調。
java實作:
抽象被觀察者(抽象主題):Observable.java
抽象被觀察者的具體實作(主題服務):ObservableImpl.java
抽象觀察者(使用者(訂閱者)的抽象):Observer.java
抽象觀察者的具體實作(使用者(訂閱者)具體實作):User.java
Observable.java(被訂閱服務的實作)
public interface Observable {
//注冊使用者
public void registerUser(Observer observer);
//移除使用者
public void removeUser(Observer observer);
//通知觀察者
public void notifyObserver();
}
ObservableImpl.java(被訂閱服務的實作)
public class ObservableImpl implements Observable {
private List userList = new ArrayList<>();;
private String message;
@Override
public void registerUser(Observer observer) {
// TODO Auto-generated method stub
userList.add(observer);
}
@Override
public void removeUser(Observer observer) {
// TODO Auto-generated method stub
if (observer != null && userList != null && userList.size() > 0) {
userList.remove(observer);
}
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
userList.forEach(x -> {
x.getTopicNotification(message);
});
}
public void setInformation(String str){
this.message=str;
notifyObserver();
}
}
Observer.java(訂閱者的抽象)
public interface Observer {
public void getTopicNotification(String message);
}
User.java(訂閱對象的實作)
public class User implements Observer {
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void getTopicNotification(String message) {
// TODO Auto-generated method stub
this.message = message;
read();
}
public void read() {
System.out.println(name + ":" + "收到消息内為:" + message);
}
}
測試。。。。。。。。。。
public static void main(String[] args) {
Observer z=new User("jinxudong");
Observer s = new User("jinxudong1");
Observer e = new User("jinxudong2");
ObservableImpl wechatServer=new ObservableImpl();
wechatServer.registerUser(s);
wechatServer.registerUser(z);
wechatServer.registerUser(e);
wechatServer.setInformation("釋出第一次消息...");
System.out.println("-------------------測試取消關注 -------");
wechatServer.removeUser(z);
wechatServer.setInformation("釋出第二次消息...");
}
測試結果:
jinxudong1:收到消息内為:釋出第一次消息...
jinxudong:收到消息内為:釋出第一次消息...
jinxudong2:收到消息内為:釋出第一次消息...
-------------------測試取消關注 -------
jinxudong1:收到消息内為:釋出第二次消息...
jinxudong2:收到消息内為:釋出第二次消息...