掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

本文轉(zhuǎn)載自微信公眾號「 泰斗賢若如」,轉(zhuǎn)載本文請聯(lián)系 泰斗賢若如公眾號。
前言
通過學習設(shè)計模式,我們知道根據(jù)目的、用途的不同,把設(shè)計模式分為創(chuàng)建型模式、結(jié)構(gòu)型模式、行為型模式。
本篇,我想對結(jié)構(gòu)型模式進行一番總結(jié)、探討。
認識結(jié)構(gòu)型模式
結(jié)構(gòu)型模式所描述的是如何將類和對象結(jié)合在一起來形成一個更大的結(jié)構(gòu),它描述兩種不同的事物:類和對象,根據(jù)這一點,可分為類結(jié)構(gòu)型和對象結(jié)構(gòu)型模式。類結(jié)構(gòu)型模式關(guān)心類的組合,由多個類可以組合成一個更大的系統(tǒng),在類結(jié)構(gòu)型模式中一般只存在繼承關(guān)系和實現(xiàn)關(guān)系;對象結(jié)構(gòu)型模式關(guān)心類與對象的組合,通過關(guān)聯(lián)關(guān)系使得在一個類中定義另一個類的實例對象,然后通過該對象調(diào)用其方法。根據(jù)“合成復用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來替代繼承關(guān)系,因此大部分結(jié)構(gòu)型模式都是對象結(jié)構(gòu)型模式
結(jié)構(gòu)型模式的實例
以適配器模式為例,代碼解析
說到適配器,我們最熟悉的莫過于電源適配器了,也就是手機的充電頭。它就是適配器模式的一個應用。
大家可以試想一下,如果你有一條連接電腦和手機的 USB 數(shù)據(jù)線,連接電腦的一端從電腦接口處接收 5V 的電壓,連接手機的一端向手機輸出 5V 的電壓,并且它們都工作良好。
我們常用的家用電壓都是 220V,所以 USB 數(shù)據(jù)線不能直接拿來給手機充電,這時候我們有兩種方案:
如果你使用過早期的手機,就會知道以前的手機廠商采用的就是第一種方案:早期的手機充電器都是單獨制作的,充電頭和充電線是連在一起的,但現(xiàn)在的手機都采用了電源適配器加數(shù)據(jù)線的方案。
現(xiàn)在我要說的適配器模式,就是將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
適配的意思是適應、匹配。通俗地講,適配器模式適用于有相關(guān)性但不兼容的結(jié)構(gòu),源接口通過一個中間件轉(zhuǎn)換后才可以適用于目標接口,這個轉(zhuǎn)換過程就是適配,這個中間件就稱之為適配器。
家用電源和 USB 數(shù)據(jù)線有相關(guān)性:家用電源輸出電壓,USB 數(shù)據(jù)線輸入電壓。但兩個接口無法兼容,因為一個輸出 220V,一個輸入 5V,通過適配器將輸出 220V 轉(zhuǎn)換成輸出 5V 之后才可以一起工作。
接下來,我用程序模擬一下這個過程:
家庭電源提供220V的電壓
HomeBattery類:
- class HomeBattery {
- int supply() {
- // 家用電源提供一個 220V 的輸出電壓
- return 220;
- }
- }
USB 數(shù)據(jù)線只接收 5V 的充電電壓
USBLine類:
- class USBLine {
- void charge(int volt) {
- // 如果電壓不是 5V,拋出異常
- if (volt != 5) throw new IllegalArgumentException("只能接收 5V 電壓");
- // 如果電壓是 5V,正常充電
- System.out.println("正常充電");
- }
- }
先來看看適配之前,用戶如果直接用家庭電源給手機充電:
User類
- 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);
- }
- }
運行結(jié)果如下:
這時,如果加入電源適配器:
Adapter類
- class Adapter {
- int convert(int homeVolt) {
- // 適配過程:使用電阻、電容等器件將其降低為輸出 5V
- int chargeVolt = homeVolt - 215;
- return chargeVolt;
- }
- }
然后,用戶再使用適配器將家庭電源提供的電壓轉(zhuǎn)換為充電電壓:
User類
- 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);
- }
- }
運行結(jié)果如下:
這就是適配器模式。在我們?nèi)粘5拈_發(fā)中經(jīng)常會使用到各種各樣的 Adapter,都屬于適配器模式的應用。
但適配器模式并不推薦多用。因為未雨綢繆好過亡羊補牢,如果事先能預防接口不同的問題,不匹配問題就不會發(fā)生,只有遇到源接口無法改變時,才應該考慮使用適配器。比如現(xiàn)代的電源插口中很多已經(jīng)增加了專門的充電接口,讓我們不需要再使用適配器轉(zhuǎn)換接口,這又是社會的一個進步。
總結(jié)
以上內(nèi)容是我對結(jié)構(gòu)型模式做的一次簡單的總結(jié),讓大家對結(jié)構(gòu)型模式整體上有一些理解和認識,文中我以結(jié)構(gòu)型模式中的適配器模式為例,進行了代碼演示,也能讓大家進一步進行了解結(jié)構(gòu)型模式,程序是一個不斷改進的過程,希望我們學了設(shè)計模式之后能夠?qū)W以致用,優(yōu)化自己的程序。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流