這篇文章主要講解了“怎么理解設(shè)計(jì)模式的結(jié)構(gòu)型模式”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么理解設(shè)計(jì)模式的結(jié)構(gòu)型模式”吧!
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的寧陵網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
認(rèn)識(shí)結(jié)構(gòu)型模式
結(jié)構(gòu)型模式所描述的是如何將類(lèi)和對(duì)象結(jié)合在一起來(lái)形成一個(gè)更大的結(jié)構(gòu),它描述兩種不同的事物:類(lèi)和對(duì)象,根據(jù)這一點(diǎn),可分為類(lèi)結(jié)構(gòu)型和對(duì)象結(jié)構(gòu)型模式。類(lèi)結(jié)構(gòu)型模式關(guān)心類(lèi)的組合,由多個(gè)類(lèi)可以組合成一個(gè)更大的系統(tǒng),在類(lèi)結(jié)構(gòu)型模式中一般只存在繼承關(guān)系和實(shí)現(xiàn)關(guān)系;對(duì)象結(jié)構(gòu)型模式關(guān)心類(lèi)與對(duì)象的組合,通過(guò)關(guān)聯(lián)關(guān)系使得在一個(gè)類(lèi)中定義另一個(gè)類(lèi)的實(shí)例對(duì)象,然后通過(guò)該對(duì)象調(diào)用其方法。根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來(lái)替代繼承關(guān)系,因此大部分結(jié)構(gòu)型模式都是對(duì)象結(jié)構(gòu)型模式
結(jié)構(gòu)型模式的實(shí)例
適配器模式:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一種接口,這樣就能實(shí)現(xiàn)已有接口的復(fù)用。適配器主要有類(lèi)適配器和對(duì)象適配器兩種實(shí)現(xiàn)方式,通常情況下,推薦優(yōu)先使用對(duì)象適配器方式。
橋接模式:將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。它主要用于應(yīng)對(duì)多維度變化點(diǎn)問(wèn)題,通過(guò)對(duì)象組合的方式,可以極大地減少子類(lèi)的數(shù)目,同時(shí)還能讓不同維度獨(dú)立擴(kuò)展變化。
組合模式:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“整合-部分”的層次結(jié)構(gòu),從而使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性,也就是客戶端能夠透明地?zé)o區(qū)別地操作兩者。
裝飾模式:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來(lái)說(shuō),裝飾模式相比生成子類(lèi)更為靈活。假若使用多繼承的方式來(lái)完成職責(zé)的添加,將會(huì)不可避免地造成子類(lèi)數(shù)目的“爆炸性”增長(zhǎng),此外,因?yàn)槭庆o態(tài)增加的,那也就不可能在運(yùn)行狀態(tài)時(shí)動(dòng)態(tài)地添加或者刪除額外職責(zé)呢。
外觀模式:為子系統(tǒng)中的一組接口提供一個(gè)一致的接口,外觀模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。這樣原來(lái)需要客戶直接與復(fù)雜的子系統(tǒng)打交道、交互,現(xiàn)在這一過(guò)程將完全將交由外觀對(duì)象來(lái)完成,極大地方便了客戶端的調(diào)用。
享元模式:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。享元模式關(guān)鍵是將對(duì)象的內(nèi)部狀態(tài)和外部狀態(tài)分離,盡可能地對(duì)“穩(wěn)定”的內(nèi)部狀態(tài)進(jìn)行共享,而將會(huì)隨運(yùn)用場(chǎng)景而改變的狀態(tài)通過(guò)外部狀態(tài)傳入。
代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。主要是在客戶端和目標(biāo)對(duì)象間增加一層間接層,通過(guò)這個(gè)間接層來(lái)完成對(duì)目標(biāo)對(duì)象的種種控制操作,所以也就形成了不同功能類(lèi)型的代理呢,比如遠(yuǎn)程代理、保護(hù)代理和虛代理等等。
···
以適配器模式為例,代碼解析
說(shuō)到適配器,我們最熟悉的莫過(guò)于電源適配器了,也就是手機(jī)的充電頭。它就是適配器模式的一個(gè)應(yīng)用。
大家可以試想一下,如果你有一條連接電腦和手機(jī)的 USB 數(shù)據(jù)線,連接電腦的一端從電腦接口處接收 5V 的電壓,連接手機(jī)的一端向手機(jī)輸出 5V 的電壓,并且它們都工作良好。
我們常用的家用電壓都是 220V,所以 USB 數(shù)據(jù)線不能直接拿來(lái)給手機(jī)充電,這時(shí)候我們有兩種方案:
一、單獨(dú)制作手機(jī)充電器,接收 220V 家用電壓,輸出 5V 電壓。
二、添加一個(gè)適配器,將 220V 家庭電壓轉(zhuǎn)化為類(lèi)似電腦接口的 5V 電壓,再連接數(shù)據(jù)線給手機(jī)充電。
如果你使用過(guò)早期的手機(jī),就會(huì)知道以前的手機(jī)廠商采用的就是第一種方案:早期的手機(jī)充電器都是單獨(dú)制作的,充電頭和充電線是連在一起的,但現(xiàn)在的手機(jī)都采用了電源適配器加數(shù)據(jù)線的方案。
現(xiàn)在我要說(shuō)的適配器模式,就是將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類(lèi)能一起工作。
適配的意思是適應(yīng)、匹配。通俗地講,適配器模式適用于有相關(guān)性但不兼容的結(jié)構(gòu),源接口通過(guò)一個(gè)中間件轉(zhuǎn)換后才可以適用于目標(biāo)接口,這個(gè)轉(zhuǎn)換過(guò)程就是適配,這個(gè)中間件就稱(chēng)之為適配器。
家用電源和 USB 數(shù)據(jù)線有相關(guān)性:家用電源輸出電壓,USB 數(shù)據(jù)線輸入電壓。但兩個(gè)接口無(wú)法兼容,因?yàn)橐粋€(gè)輸出 220V,一個(gè)輸入 5V,通過(guò)適配器將輸出 220V 轉(zhuǎn)換成輸出 5V 之后才可以一起工作。
接下來(lái),我用程序模擬一下這個(gè)過(guò)程:
家庭電源提供220V的電壓
HomeBattery類(lèi):
class HomeBattery { int supply() { // 家用電源提供一個(gè) 220V 的輸出電壓 return 220; } }
USB 數(shù)據(jù)線只接收 5V 的充電電壓
USBLine類(lèi):
class USBLine { void charge(int volt) { // 如果電壓不是 5V,拋出異常 if (volt != 5) throw new IllegalArgumentException("只能接收 5V 電壓"); // 如果電壓是 5V,正常充電 System.out.println("正常充電"); } }
先來(lái)看看適配之前,用戶如果直接用家庭電源給手機(jī)充電:
User類(lèi)
public class User { @Test public void chargeForPhone() { HomeBattery homeBattery = new HomeBattery(); int homeVolt = homeBattery.supply(); System.out.println("家庭電源提供的電壓是 " + homeVolt + "V"); USBLine usbLine = new USBLine(); usbLine.charge(homeVolt); } }
運(yùn)行結(jié)果如下:
家庭電源提供的電壓是 220V
java.lang.IllegalArgumentException: 只能接收 5V 電壓
這時(shí),如果加入電源適配器:
Adapter類(lèi)
class Adapter { int convert(int homeVolt) { // 適配過(guò)程:使用電阻、電容等器件將其降低為輸出 5V int chargeVolt = homeVolt - 215; return chargeVolt; } }
然后,用戶再使用適配器將家庭電源提供的電壓轉(zhuǎn)換為充電電壓:
User類(lèi)
public class User { @Test public void chargeForPhone() { HomeBattery homeBattery = new HomeBattery(); int homeVolt = homeBattery.supply(); System.out.println("家庭電源提供的電壓是 " + homeVolt + "V"); Adapter adapter = new Adapter(); int chargeVolt = adapter.convert(homeVolt); System.out.println("使用適配器將家庭電壓轉(zhuǎn)換成了 " + chargeVolt + "V"); USBLine usbLine = new USBLine(); usbLine.charge(chargeVolt); } }
運(yùn)行結(jié)果如下:
家庭電源提供的電壓是 220V
使用適配器將家庭電壓轉(zhuǎn)換成了 5V
正常充電
這就是適配器模式。在我們?nèi)粘5拈_(kāi)發(fā)中經(jīng)常會(huì)使用到各種各樣的 Adapter,都屬于適配器模式的應(yīng)用。
但適配器模式并不推薦多用。因?yàn)槲从昃I繆好過(guò)亡羊補(bǔ)牢,如果事先能預(yù)防接口不同的問(wèn)題,不匹配問(wèn)題就不會(huì)發(fā)生,只有遇到源接口無(wú)法改變時(shí),才應(yīng)該考慮使用適配器。比如現(xiàn)代的電源插口中很多已經(jīng)增加了專(zhuān)門(mén)的充電接口,讓我們不需要再使用適配器轉(zhuǎn)換接口,這又是社會(huì)的一個(gè)進(jìn)步。
感謝各位的閱讀,以上就是“怎么理解設(shè)計(jì)模式的結(jié)構(gòu)型模式”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么理解設(shè)計(jì)模式的結(jié)構(gòu)型模式這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!