被觀察者(主題)接口
定義主題對象接口網絡
/**抽象主題角色: 這個主題對象在狀態上發生變化時,會通知全部觀察者對象 也叫事件對象 */ public interface Subject { //增長一個觀察者 public void addWatcher(Watcher watcher); //刪除一個觀察者 public void removeWatcher(Watcher watcher); //通知全部的觀察者 public void notifyWatchers(String str); }
實現類多線程
public class SubjectImpl implements Subject{ //建立一個隊列來存儲一個或多個觀察者 private ArrayList<Watcher> al= new ArrayList<Watcher>(); @Override public void addWatcher(Watcher watcher) { al.add(watcher);//添加觀察者到指定隊列中 } @Override public void removeWatcher(Watcher watcher) { al.remove(watcher);//從隊列中刪除觀察者 } @Override public void notifyWatchers(String str) { //遍歷隊列 for(int i=0;i<al.size();i++){ Watcher watcher = al.get(i);//獲取隊列中的觀察者對象 watcher.update(str);//調用它的update()方法 } } }
觀察者(監聽器)接口併發
觀察者接口ide
public interface Watcher { //更新本身 public void update(String str); }
觀察者實現類性能
public class WatcherImpl implements Watcher{ @Override public void update(String str) { System.out.println("已經收到通知:"+str); } }
測試測試
public class ClientTest { public static void main(String[] args){ //建立被觀察者對象 SubjectImpl subject = new SubjectImpl(); //建立觀察者 WatcherImpl watcher1 = new WatcherImpl(); WatcherImpl watcher2 = new WatcherImpl(); WatcherImpl watcher3 = new WatcherImpl(); //添加多個觀察者 subject.addWatcher(watcher1); subject.addWatcher(watcher2); subject.addWatcher(watcher3); //通知觀察者 subject.notifyWatchers("你好!"); //分割 System.out.println("--------------------------------"); //刪除一個觀察者 subject.removeWatcher(watcher1); //再次通知觀察者 subject.notifyWatchers("很好!"); } }
主要適用於多個對象依賴某一個對象的狀態並,當某對象狀態發生改變時,要通知其餘依賴對象作出更新。編碼
是一種1對多的關係。固然,若是依賴的對象只有一個時也是一種特殊的一對一關係。url
Reactor模式(NIO)
Reactor模式是事件驅動的,有一個或多個併發輸入源,有一個Service Handler,有多個Request Handlers;spa
這個Service Handler會同步的將輸入的請求(Event)多路複用的分發給相應的Request Handler.net
圖1
這種方式就是,應用業務向一箇中間人註冊一個回調(event handler),當IO就緒後,就這個中間人產生一個事件,並通知此handler進行處理。
JDK1.4提供了對非阻塞IO(NIO)的支持,JDK1.6版本使用epoll替代了傳統的select/poll,極大的提高了NIO通訊的性能
觀察者模式和Recactor模式的主要區別
本身悟吧
我理解的就是觀察者模式不如Reactor模式靈活(觀察者模式沒有句柄),就像上述代碼,觀察者模式通知了全部對象,沒有像Reactor 根據Inputer去通知響應的Request
Reactor多線程模型(AIO)
對於一些小容量應用場景,可使用單線程模型。可是對於高負載、大併發的應用場景卻不合適。因而產生了Reactor多線程。
Reactor多線程模型的特色:
1)有專門一個NIO線程-Acceptor線程用於監聽服務端,接收客戶端的TCP鏈接請求;
2)網絡IO操做-讀、寫等由一個NIO線程池負責,線程池能夠採用標準的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送;
3)1個NIO線程能夠同時處理N條鏈路,可是1個鏈路只對應1個NIO線程,防止發生併發操做問題。
圖2
圖1中的Reactor圖2Reactor Thread是一個意思