結構型模式清單:適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式、代理模式。
其中,適配器模式、裝飾模式、享元模式、代理模式適用場景較多,須重點掌握。
適配器模式分為類適配器模式、對象適配器模式、缺省適配器模式。
適配器模式思想原理很簡單。舉個簡單的例子:筆記本電腦充電。筆記本電腦充電的過程涉及三個元件:筆記本、電源適配器、插座。大家可以思考為什么有電源適配器。
首先,插座并不知曉筆記本充電時的額定功率的,因此,需要一個電源適配器,來達到筆記本充電時的額定功率。電源適配器是智能的,一方是220V插座電流流入,另一方是筆記本額定電流輸出至筆記本。因此,適配器擔任了一個重要的中介人角色。
首先來看一下流程圖。
Interface是接口,接口中定義了兩個方法:run1、run2。Adapter是適配器類,Adaptee是被適配的類。
現在提出一個需求:Adaptee類只需要run2這一方法。
因此,Adapter就要協助Adaptee屏蔽掉run1這一方法。
有人會納悶為什么要叫做“屏蔽”。事實上,直接繼承接口,必須實現所有的方法。你不需要run1方法,你就要想辦法屏蔽。
如何屏蔽run1方法?
上代碼:
class Adapter{ public void run1(){ System.out.首先在Adapter中定義run1方法。class Adaptee extends Adapter implements C這句很關鍵。Adapter實現Interface接口,Adaptee繼承Adapter類,又因為Adapter已經實現了run1方法,留給Adaptee實現的方法就只有run2了。這樣,就達到了我們想要的目的:Adaptee類實現run2方法,不實現run1方法。我們先來回顧一下類適配器模式是怎樣寫的: class Adaptee extends Adapter implements C Adapter是以類的形式來適配的。
試想一下某些場景,如果擺在你面前是許多許多個適配器,你覺得用類適配器模式方便嗎?
不方便。
對象適配器對比類適配器最大優勢就是動態裝載適配器。也就是說你想用哪個適配器都可以通過適配器的實例對象來使用。
上代碼:
interface Interface{ public void run1(); public void run2();}class Adapter{ public void run1(){ System.out.println("run1方法"); }}class Adaptee implements Interface{ private Adapter adapter; public Adaptee(Adapter adapter){ this.adapter = adapter; } public void run1() { this.adapter.run1(); } public void run2() { System.out.println("Adaptee實現run2方法"); }}很顯然,我們可以通過Adaptee的構造函數將Adapter的實例對象注入Adaptee中,利用Adapter的run1方法來適配Interface接口中的run1方法。
Earpods不兼容Andriod系統,嗯,Earpods壓根就沒對Andriod機提供適配功能。
因此,市場上出現了很多iOS、Andriod通用的耳機,都能與之適配。
缺省適配器屬于類適配器的一種。是類適配器的特殊形式。缺省適配器實現接口中的所有方法,每一個方法都是空的,嗯,like this…”public void balabla(){}“。因此,被適配的對象只需繼承缺省適配器就能使用或重寫自己想要的方法。
上代碼!
class iphone extends Earphone{ public void iOS(){ System.out.println("iPhone"); }}class Galaxy extends Earphone{ public void Andriod(){ System.out.println("Galaxy"); }}class Earphone implements Interface{ public void iOS() { } public void Andriod() { }}interface Interface{ void iOS(); void Andriod();}Tips:Earphone(Adapter)、iPhone(Adaptee)、Galaxy(Adaptee)
新聞熱點
疑難解答