微信發個朋友圈沒有想到也可以用設計模式來實現——觀察者模式
阿新 • • 發佈:2019-02-13
觀察者模式的概念
觀察者模式(Observer Pattern):定義物件之間的一種一對多依賴關係,使得每當一個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。觀察者模式的別名包括髮布-訂閱(Publish/Subscribe)模式、模型-檢視(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。觀察者模式是一種物件行為型模式。
當某個狀態的改變,那與之相關的物件就會收到這個改變的通知。就好比你在微信發一條朋友圈訊息,那麼你的所有好友都會在他的微信上收到有一條新的朋友圈訊息的提示一樣。你在微信發了一條朋友圈訊息可以理解成狀態被改變了,這個狀態的改變就要通知你的好友你改變了一個狀態,而這個狀態就是你發了一條朋友圈訊息,那麼你的好友就能檢視到你最新發的的朋友圈訊息了。
在微信上可以關注牛人們的公眾號,當公眾號發了一篇新的文章的時候,所有關注此公眾號的微信使用者都會收到一條有最新訂閱號的小紅點通知。這種型別的事例很多,前人大神們把這種模式或者模型總結起來就成了觀察者設計模式。這是一種通用的經驗知識,用來解決相同型別問題的方法。學習技術不能只看,不動手實踐,否則白看了。
發朋友圈所有好友都收到有最新訊息這個過程,我們先找出觀察目標(Subject)和觀察者(Observer),觀察目標它是一個狀態改變者,就是因為它得狀態改變了才需要通知觀察者。這裡很顯然發朋友圈這個人是觀察目標,他得好友是觀察者。下面用觀察者設計模式來實現發朋友圈的這個一個功能。
//觀察者介面
public interface WeChatObserver {
//傳送朋友圈方法
public void sendFriendBlock(String msg, WeChatSubject wcs);
//接收最新朋友圈訊息
public void receiveFriendBlockMsg(String msg);
}
//具體實現觀察者類(微信使用者) public class ConWeChatObserver implements WeChatObserver { //名字 private final String name; public ConWeChatObserver(String name) { this.name = name; } //發朋友圈 @Override public void sendFriendBlock(String msg, WeChatSubject wcs) { String str = this.name+"發了一條朋友圈,內容是:" + msg+"."; System.out.println("我發了一條朋友圈!"); wcs.notifyAllFriend(str, this.name); } //接收朋友圈訊息 @Override public void receiveFriendBlockMsg(String msg) { System.out.println("---------------------------------------"); System.out.println(this.name + "收到一條新得朋友圈訊息!"); System.out.println(msg); } public String getName() { return this.name; } }
import java.util.ArrayList;
import java.util.List;
//觀察目標
public abstract class WeChatSubject {
//觀察者也就是微信好友
protected List<WeChatObserver> obsArray = new ArrayList<WeChatObserver>();
//新增微信好友
public void addFriend(WeChatObserver obs){
this.obsArray.add(obs);
}
//向朋友推送一條朋友圈訊息
public abstract void notifyAllFriend(String msg, String name);
}
//具體實現觀察目標得類
public class ConWeChatSubject extends WeChatSubject {
@Override
public void notifyAllFriend(String msg, String name) {
//通知好友,有最新朋友圈訊息
for(WeChatObserver obs : this.obsArray){
obs.receiveFriendBlockMsg(msg);
}
}
}
//測試類
public class WeChatTestClient {
public static void main(String[] args) {
//觀察目標物件
WeChatSubject wcs = new ConWeChatSubject();
//觀察者
WeChatObserver user1 = new ConWeChatObserver("牛頓");
WeChatObserver user2 = new ConWeChatObserver("霍金");
WeChatObserver user3 = new ConWeChatObserver("伽利略");
WeChatObserver user4 = new ConWeChatObserver("愛恩斯坦");
//牛頓同學得微信好友有霍金、伽利略、愛恩斯坦
wcs.addFriend(user2);
wcs.addFriend(user3);
wcs.addFriend(user4);
//牛頓發個朋友圈
user1.sendFriendBlock("我今天很開心,因為炒股小賺了一筆!", wcs);
System.out.println("------------------------------------------");
//發朋友圈----->通知所有好友---->好友接收最新朋友圈訊息
}
}
我覺得設計模式學習了就要去實踐或者應用到專案中去,只有多用了才能更好理解它的思想,才能寫出更加好得程式碼。參考:https://gof.quanke.name/