設計模式面試總結

1.策略模式

定義了算法簇,進行封裝,他們之間可以相互替換

實現:接口類來實現算法簇;可以用類的繼承或者抽象類的繼承來實現個體

2.觀察者模式

手動實現:

兩個接口 subject:registerObserver(),removeOberver(),notifyOberver()
Oberver:update()
採用  List來保存observer,通過迭代來調用每一個List裏面的Observer的update方法

java實現

一個類:Oberverable:addOberver(),deleteObserver(),notifyObervers(),setChanged()

一個接口
Oberver:update()

採用Vector來保存observer,setChanged來通知變化。
  1. Vector & ArrayList
    1) Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由於線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。
    2) 當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利於節約內存空間。

  2. Hashtable & HashMap
    Hashtable和HashMap它們的性能方面的比較類似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。

  3. ArrayList & LinkedList

ArrayList的內部實現是基於內部數組Object[],所以從概念上講,它更象數組,但LinkedList的內部實現是基於一組連接的記錄,所以,它更象一個鏈表結構,所以,它們在性能上有很大的差別:
從上面的分析可知,在ArrayList的前面或中間插入數據時,你必須將其後的所有數據相應的後移,這樣必然要花費較多時間,所以,當你的操作是在一列數據的後面添加數據而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能; 而訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿着連接方向一個一個元素地去查找,直到找到所需的元素爲止,所以,當你的操作是在一列數據的前面或中間添加或刪除數據,並且按照順序訪問其中的元素時,就應該使用LinkedList了。
http://wiki.jikexueyuan.com/project/java-collection/linkedhashmap.html

反應器模式與觀察者模式的異同

反應器模式

是一種爲處理服務請求併發提交到一個或者多個服務處理程序的事件設計模式。當請求抵達後,服務處理程序使用解多路分配策略,然後同步地派發這些請求至相關的請求處理程序。

觀察者模式

有時被稱作發佈/訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

將事件多路分用、將事件分派到各自相應的事件處理程序。

分佈式系統中的服務器應用程序必須處理多個向它們發送服務請求的客戶機。然而,在調用特定的服務之前,服務器應用程序必須將每個傳入請求多路分用並分派到各自相應的服務提供者。反應器模式正好適用於這一功能。它允許事件驅動應用程序將服務請求多路分用並進行分派,然後,這些服務請求被併發地從一個或多個客戶機傳送到應用程序。

反應器模式(Reactor pattern)與觀察者模式(Observer pattern)在這個方面極爲相似:

當一個主體發生改變時,所有依屬體都得到通知。

不過

觀察者模式與單個事件源關聯,而反應器模式則與多個事件源關聯。

反應器設計模式(Reactor pattern)是一種爲處理服務請求併發 提交到一個或者多個服務處理程序的事件設計模式。當請求抵達後,服務處理程序使用解多路分配策略,然後同步地派發這些請求至相關的請求處理程序。

裝飾者模式

  1. 一個抽象類作爲初始類
  2. 一些實際的工具
  3. 裝飾類集成自抽象類
  4. 實際的裝飾類繼承自裝飾類

Java 的IO

工廠模式與抽象工廠模式還有簡單工廠模式

簡單工廠模式:一個類搞定

工廠模式:由子類去決定生產什麼(抽象類)
既子類繼承工廠,實現創造方法

抽象工廠:定義了一個接口,所有的實際工廠實現此接口。用於創建相關或對象的家族,而不需要制定具體類

單例模式

雙重檢查
飽漢與餓漢:飽漢getInstance方法創建對象
餓漢:定義爲static方法或者放在static塊中,在類加載時就初始化了

命令模式

封裝命令(接口),由實際命令去實現命令接口,調用者調用命令。

用在隊列請求(日程安排、線程池、工作隊列)、日誌請求

將請求封裝成對象,以便使用不同的請求,隊列或者日誌來參數化其他對象,命令模式也支持可撤銷的操作。

適配器模式

將一個類的接口,轉換成客戶期望的另一個接口

舊的枚舉迭代器。新的迭代器適配,將舊的適配成新的枚舉

外觀模式

提供一個統一的接口,用來訪問子系統中的一羣接口,提供一個高層接口讓子系統更容易使用

模板方法模式

在一個方法中定義一個算法的顧家,而將一些步驟延遲到子類中上線。

模板方法在不改變算法結構的情況下,重新定義算法的某些步驟

迭代器模式

java.util.Iterator
提供一種方法順序訪問一個聚合對象中的各個元素

組合模式

將對象組合成樹形結構來表現“整體/部分”的層次結構,中間的調用,可以用迭代器來建立

狀態模式

允許對象在內部狀態改變時改變他的行爲,對象看起來好像修改了他的類。

代理模式

RMI
爲另一個對象提供一個替身或者佔位符,以控制對這個對象的訪問

分爲遠程代理,和虛擬代理

虛擬代理:一個接口
分別由 被代理者 和 代理者實現

MVC模式

使用了
對象行爲類的設計模式,對同步事件分揀和派發。

Dispatcher(分發器),Notifer(通知器)

應用程序提供的每種服務對應一個獨立的Event Handler,每種Handler處理一種類型的事件。所有的Event Handler有接口。這樣,不同的Event Handler會註冊到Initiation Dispacher, Initiation Dispatcher使用Synchronous Event Demultiplexer等待事件的發生。事件發生時,Demultiplexer通知Dispacher,Dispatcher回調Handler,Handler調用對應的事件處理方法。

和觀察者模式(Observer)[5]相關,當一個對象改變,其他多個模塊被通知。在反應堆模式中,當某個Handle感有興趣的事件發生,Handler被通知。反應堆模式用來分揀多個事件源的事件,而觀察者模式常常只關聯一個事件源。
和責任鏈模式相關(Chain of Responsibility)[5],當把一個請求委託給服務提供者。反應堆模式與責任鏈不同,反應堆模式關聯一個特定的事件處理器到特定的事件源,而責任鏈模式搜索一個序列去定義第一個匹配的事件處理器。
反應堆模式還被認爲是異步Proactor[18]模式的同步變種,Proactor支持異步事件源的事件分揀和多個事件處理器的分派。不同的時,反應堆模式支持的是沒有阻塞的同步事件源。
主動對象模式[17]分離了方法的執行和調用,簡化了多個線程調用時同步控制的複雜性(這個模式我也翻譯過了),。當多線程不可用,或者任務使用多線程太複雜了,反應堆模式經常替換主動對象。
在實現反應堆模式的時候,可以提供一個外觀(Facade)[5]類處理事件的分揀。一個外觀類用來隱藏一個子系統中複雜的對象關係

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章