設計模式的學習 總結(1)代理模式,適配器模式,外觀模式和裝飾器模式的異同

1、定義spring

代理模式(Proxy):爲其餘對象提供一種代理以控制對這個對象的訪問。代理類須要持有一個真實對象,用來對真實對象進行訪問。mvc

適配器模式(Adapter):將一個類的接口轉換成客戶但願的另一個接口,使得本來接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。spa

適配器類提供新的接口給用戶調用,同時須要持有一個被適配類的對象,在適配器類的接口方法中,通過本身的特定邏輯後,最終仍是會調用被適配的類對象的老接口。代理

即一個三孔的插頭,進過適配器類的處理後,能插進原有的二孔插座裏。對象

外觀模式(Facade):咱們定義一箇中間層(外觀類),爲客戶端提供能夠調用的接口。同時該接口可能調用子系統中的一組接口,從而隱藏系統的複雜性。blog

即在外觀類的方法中,對原有系統的接口進行組合和封裝,方便使用者使用。外觀類須要持有各個子類的對象,經過這些對象調用子系統接口。繼承

裝飾器模式(Decorator):原有的類結構不變,可是功能不能知足現有的需求,對原有的功能進行加強。裝飾器類須要持有一個被裝飾類對象。接口

二類圖ci

代理模式get

能夠看到,真實對象和代理類,須要實現一個共同接口,因此他們具備共同的方法。

用戶建立一個接口對象,其實是代理類的實現。就是說用戶訪問的是代理類對象,執行的是代理類重寫的方法。

而一個代理類的構建,須要一個真實對象(能夠在構建方法中new一個真實對象,還能夠在構建方法中,傳入一個真實對象)。代理類能夠經過這個真實對象進行交互調用到真實對象的方法。在調用真實對象方法的先後,添加本身的特定邏輯。

Subject subject = new Proxy(new RealSubject());

subject.request();

 

適配器模式

能夠看到,首先咱們要定義一個目標接口Target,該接口定義了給外部請求者使用的接口。

而後定義一個適配器類Adapter,它實現了目標接口,重寫了接口中定義的方法。

而後在適配器類中,咱們須要引入一個須要適配的類對象。這裏有分歧,能夠經過

對象方式引入

就是適配器類Adapter能夠定義一個成員屬性爲須要適配的類的對象Adaptee,在構造方法中new一個或者傳入一個須要適配的類的對象。

而後在重寫的Request()方法時,去執行本身的特殊邏輯,並經過Adaptee對象,去調用原有的接口方法。

類方式引入

就是適配器類Adapter即實現目標接口Target,又繼承須要適配的類Adaptee,而後在用戶執行Request()方法時,執行完適配器的邏輯後,

能夠經過super.SpecificRequest()的方式,調用到原有的接口方法。

 

這裏就會顯出代理模式和適配器模式最大的區別,代理模式是與原對象實現同一個接口,而適配器類則是匹配新接口,說白了,實現一個新的接口。

外觀模式

定義外觀類,和暴露給用戶使用的接口方法。

外觀類等於新增長了一層,對已有系統接口的封裝。

好比用戶要實現某個功能,須要調用多個不一樣類型的接口方法,才能完成用戶但願的操做。

這時外觀類給用戶提供一個接口,用戶請求後就能夠獲得想要的結果,而不一樣類型的調用,複雜的邏輯,交給外觀類處理。

 

外觀模式,說白了就是爲系統和用戶之間, 增長一層接口的封裝,由外觀類去處理複雜的接口調用和邏輯,最後返回用戶想要的結果。就像spring mvc中的controller層同樣。

裝飾器模式

裝飾器類須要和被裝飾類,實現同一個接口,而且裝飾器類,須要持有一個被裝飾類對象。或者裝飾器類直接繼承被裝飾類,

裝飾器類是對被裝飾類的功能的加強,因此裝飾器類能夠增長本身的屬性和方法,用於功能的加強。

即裝飾器類在重寫了被裝飾類的方法中,不但能夠經過持有的被裝飾類對象進行原有接口的調用,還能夠調用本身的加強方法。

3、總結

代理模式:代理模式主要體現隔離。代理類和真實對象實現同一個接口,擁有共同的方法。代理類持有被代理類對象,訪問者沒法直接訪問到真實對象,只能經過代理類訪問真實對象。

適配器模式:用戶訪問新接口,適配器不但實現新接口的方法,還持有一個原有接口對象,在實現新接口的方法中,處理本身的特定邏輯,最後調用原有接口方法,達到適配的目的。

外觀模式:增長一層接口的封裝,簡化使用者的操做。很像spring mvc中的controller

裝飾器模式:裝飾器類是對被裝飾類的加強。實現方式有兩種:裝飾器類和被裝飾類,能夠實現同一個接口,同時裝飾器類持有一個被裝飾類對象。也可讓裝飾器類直接繼承被裝飾類。在裝飾器類中,增長新的成員屬性和方法。好比被裝飾類是Circle,它只有一個方法draw(),那麼裝飾器類CircleDecorator,能夠增長一個屬性color,並增長setColor()方法,重寫draw()方法時,裏面添加一行setColor("red")。那麼當用戶調用修飾器類的draw()方法時,就能夠畫出一個紅色的圓形。

相關文章
相關標籤/搜索