介面卡模式定義:
將乙個類的介面,轉換成客戶期望的另乙個介面。介面卡讓原本介面不相容的類可以合作無間。
需求描述:
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.物...
設計模式學習
所有的設計模式都是為了解決變化的問題,通過一定的模式來應對變化,變化應對的原則是開放封閉原則,對修改封閉,對擴充套件開放。為了應對變化,就會新增相應的層次,層次越多,的顆粒就越小,那麼 就越複雜。所以設計時考慮變化和複雜之間的取捨,為了應對變化 需要使用模式,但是又不可以一味應用模式,導致 太複雜。...