觀察者模式又被成爲發佈-訂閱模式, 屬於行爲型設計模式的一種,是一個在項目中常用的模式。程序員
定義對象間一種一對多的依賴關係,每當一個對象改變狀態時,則全部依賴它的對象都會獲得通知並被自動更新。設計模式
微信公衆號場景:假設微信用戶就是觀察者,微信公衆號是被觀察者,有多個微信用戶關注了「程序員」這個公衆號。當這個公衆號更新時就會通知這些訂閱的用戶。bash
public interface Observer {
void update(String message);
}
複製代碼
public class WeChatUser implements Observer {
private String name;
public WeChatUser(String name){
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " " + message);
}
}
複製代碼
attach
、detach
、notify
三個方法。public interface Subject {
/**
* 增長訂閱者
* @param observer
*/
void attach(Observer observer);
/**
* 刪除訂閱者
* @param observer
*/
void detach(Observer observer);
/**
* 通知訂閱者更新消息
* @param message
*/
void notify(String message);
}
複製代碼
public class SubscriptionSubject implements Subject {
private List<Observer> weChatUserList = new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
weChatUserList.add(observer);
}
@Override
public void detach(Observer observer) {
weChatUserList.remove(observer);
}
@Override
public void notify(String message) {
for(Observer observer : weChatUserList){
observer.update(message);
}
}
}
複製代碼
public class Client {
public static void main(String[] args) {
SubscriptionSubject mSubscriptionSubject = new SubscriptionSubject();
//建立微信用戶
WeChatUser user1 = new WeChatUser("用戶1");
WeChatUser user2 = new WeChatUser("用戶2");
WeChatUser user3 = new WeChatUser("用戶3");
//訂閱公衆號
mSubscriptionSubject.attach(user1);
mSubscriptionSubject.attach(user2);
mSubscriptionSubject.attach(user3);
//公衆號更新發出消息給訂閱的微信用戶
mSubscriptionSubject.notify("公衆號有更新內容了");
}
}
複製代碼
Java
中消息的通知通常是有執行順序的,那麼一個觀察者卡頓,會影響總體的執行效率,這種狀況下通常會採用異步方式。