HeadFrist設計模式學習之介面卡模式

2021-07-12 05:12:27 字數 2157 閱讀 8461

介面卡模式定義:

將乙個類的介面,轉換成客戶期望的另乙個介面。介面卡讓原本介面不相容的類可以合作無間。

需求描述:

jvm的公園裡有很多動物,在必要時會將動物們放置在box裡面,所以有很多box和動物。

現有的是乙個可以放置十個鴨子的duckbox類,其showmsg()方法可以列印每個位置的資訊,具體如下:

duckbox類:

class duckbox

public boolean add(duck duck)

else

return false;

}public boolean isfull()

public void showmsg()}}

duck類:

class duck

}測試**:

class run

}結果————————————

position:0------msg:this is a duck

position:1------msg:this is a duck

position:2------msg:this is a duck

position:3------msg:this is a duck

position:4------msg:this is a duck

position:5------msg:this is a duck

position:6------msg:this is a duck

position:7------msg:this is a duck

position:8------msg:this is a duck

position:9------msg:this is a duck

-----------------------------------

問題:放雞的box不夠用了,但是放鴨子的box有剩餘,如何做才能使duckbox類能夠同時放置chicken和duck呢?

解決方法:

建立乙個基類:animal,讓duck和chicken同時繼承animal,將duckbox中arraylist改為arraylist.

這的確是可行的,但是其中存在的問題有兩點:

①:duckbox 可以放置的動物型別好像不止兩種,任何實現了animal的類都可以放進來,這樣還不如叫box(失去了設計類本身的意義)。

②:當這種需求變得普遍時(即很多種動物都需要借居在其他相近的動物箱裡),整個程式結構變得相當混淆。

這種錯誤使用多型的方式 使程式變得難以理解(既然名為duckbox,為什麼宣告為animal?),我們應該換種思路,使用組合(介面卡模式上場了! )。  

將乙個chicken類與繼承duck類的「包裝」,組合起來,這樣在duckbox看起來是個duck,但是在方法內部呼叫的都是chicken的,就像下面這樣:

class duckadapter extends duck

@override

public string getdescription()

}測試**:

class run ;

db.showmsg();}}

結果--------------------------------

position:0------msg:this is a duck

position:1------msg:this is a chicken

position:2------msg:this is a duck

position:3------msg:this is a chicken

position:4------msg:this is a duck

position:5------msg:this is a chicken

position:6------msg:this is a duck

position:7------msg:this is a chicken

position:8------msg:this is a duck

position:9------msg:this is a chicken

----------------------------------------

好了,這樣就得到了比上面更好的解決方案,這種方案的缺點是你幾乎要重寫所有的方法來達到適配的目的,但是相比程式混淆和難以理解,這是值得的。

學習設計模式 原型設計模式

先想一下既然要建立新的例項,為什麼不直接使用 new 而要設計出乙個原型模式進行例項的複製呢?這是因為 有的時候,我們也會在不指定類名的前提下生成例項,例如像圖形編輯器中拖動現有的模型工具製作圖形的例項,這種是非常典型的生成例項的過程太過複雜,很難根據類來生成例項場景,因此需要根據現有的例項來生成新...

設計模式學習

知道設計模式已經很久了,但是一直沒有認真的去系統的學習,這幾天才開始逐漸的學習起來。下面是我學習設計模式的一些心得。要想成為一名優秀的軟體設計師或軟體架構設計師,了解一些設計模式是很有必要的。我認為學習設計模式的思路如下 一 基本概念 理解物件導向 理解重用等概念性的東西 1.什麼是物件導向?2.物...

設計模式學習

所有的設計模式都是為了解決變化的問題,通過一定的模式來應對變化,變化應對的原則是開放封閉原則,對修改封閉,對擴充套件開放。為了應對變化,就會新增相應的層次,層次越多,的顆粒就越小,那麼 就越複雜。所以設計時考慮變化和複雜之間的取捨,為了應對變化 需要使用模式,但是又不可以一味應用模式,導致 太複雜。...