天天看點

java 訂閱 釋出_java 釋出訂閱

觀察者設計模式定義了對象間的一種一對多的組合關系,以便一個對象的狀态發生變化時,所有依賴于它的對象都得到通知并自動重新整理。

釋出者釋出資訊,訂閱者擷取資訊,訂閱了就能收到資訊,沒訂閱就收不到資訊。

抽象被觀察者角色:也就是一個抽象主題,它把所有對觀察者對象的引用儲存在一個集合中,每個主題都可以有任意數量的觀察者。抽象主題提供一個接口,可以增加和删除觀察者角色。一般用一個抽象類和接口來實作。

抽象觀察者角色:為所有的具體觀察者定義一個接口,在得到主題通知時更新自己。

具體被觀察者角色:也就是一個具體的主題,在集體主題的内部狀态改變時,所有登記過的觀察者發出通知。

具體觀察者角色:實作抽象觀察者角色所需要的更新接口,一邊使本身的狀态與制圖的狀态相協調。

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:收到消息内為:釋出第二次消息...