設計模式 門面模式 介面卡模式 裝飾器模式

2021-10-20 18:28:26 字數 4232 閱讀 7598

9. 介面卡(adapter)

應用場景

優點10. 裝飾者(decorator)

設計原則

應用場景

優點提供了乙個統一的介面,用來訪問子系統中的一群介面,從而讓子系統更容易使用。

**電影需要操作很多電器,使用門面模式實現一鍵看電影功能。

public

class

subsystem

public

void

setcd

(string cd)

public

void

startwatching()

}

public

class

facade

}

public

class

client

}

最少知識原則:只和你的密友談話。也就是說客戶物件所需要互動的物件應當盡可能少。

簡化客戶端的使用

將乙個類的介面轉換成客戶希望的另乙個介面,adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。

場景一:物件介面卡模式【組合】

220v到5v的變壓器

public

class

adapyertest1

}class

adaptee

}inte***ce

target

class

adapter

implements

target

@override

public

intoutput5v()

}

場景二:類的介面卡模式【繼承】

220v到5v的變壓器

public

class

adapyertest1

}class

adaptee

}inte***ce

target

class

adapter

extends

adaptee

implements

target

}

類的介面卡的缺點:對**有汙染,我們只需要5v的電壓,但是也可以輸出220v的電壓了。

場景三:物件介面卡模式

鴨子(duck)和火雞(turkey)擁有不同的叫聲,duck 的叫聲呼叫 quack() 方法,而 turkey 呼叫 gobble() 方法。

要求將 turkey 的 gobble() 方法適配成 duck 的 quack() 方法,從而讓火雞冒充鴨子!

public

inte***ce

duck

public

inte***ce

turkey

public

class

wildturkey

implements

turkey

}

public

class

turkeyadapter

implements

duck

@override

public

void

quack()

}

public

class

client

}

為物件動態新增功能。

在不改變原有物件的基礎上,將功能附加到物件上。

裝飾者(decorator)和具體元件(concretecomponent)都繼承自元件(component),具體元件的方法實現不需要依賴於其它物件,而裝飾者組合了乙個元件,這樣它可以裝飾其它裝飾者或者具體元件。所謂裝飾,就是把這個裝飾者套在被裝飾者之上,從而動態擴充套件被裝飾者的功能。裝飾者的方法有一部分是自己的,這屬於它的功能,然後呼叫被裝飾者的方法實現,從而也保留了被裝飾者的功能。可以看到,具體元件應當是裝飾層次的最低層,因為只有具體元件的方法實現不需要依賴於其它物件。

場景一相機具備拍照功能,新增美顏等其他功能。

public

class

decoratortest

}inte***ce

component

class

concretecomponent

implements

component

}//裝飾者抽象類

abstract

class

decorator

implements

component

}//裝飾者具體實現:新增美顏效果

class

conretedecorator

extends

decorator

@override

public

void

operation()

}//裝飾者具體實現:新增濾鏡效果

class

conretedecorator2

extends

decorator

@override

public

void

operation()

}

最後輸出

場景二設計不同種類的飲料,飲料可以新增配料,比如可以新增牛奶,並且支援動態新增新配料。每增加一種配料,該飲料的**就會增加,要求計算一種飲料的**。

下圖表示在 darkroast 飲料上新增新新增 mocha 配料,之後又新增了 whip 配料。darkroast 被 mocha 包裹,mocha 又被 whip 包裹。它們都繼承自相同父類,都有 cost() 方法,外層類的 cost() 方法呼叫了內層類的 cost() 方法。

}

3.0
類應該對擴充套件開放,對修改關閉:也就是新增新功能時不需要修改**。飲料可以動態新增新的配料,而不需要去修改飲料的**。

不可能把所有的類設計成都滿足這一原則,應當把該原則應用於最有可能發生改變的地方。

設計模式 介面卡模式 門面模式

介面卡模式定義如下 將乙個類的介面變換成客戶端期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。介面卡模式和裝飾模式有一定的相似性,都起包裝的作用,但二者本質上又是不同的,裝飾模式的結果,是給乙個物件增加了一些額外的職責,而介面卡模式,則是將另乙個物件進行了 偽裝 介面...

結構型設計模式 介面卡模式和門面模式

介面卡模式和門面模式是2種使用比較多的結構型設計模式。介面卡模式的作用是讓原本不相容的介面適配成可以一起使用的介面,比如我們生活中的usb轉接頭。1.介面卡模式 假如有下面乙個業務,要做一道泡茶的工序,包括洗茶具 洗茶葉 泡茶3步,現在的2段 分別是用a茶具泡普洱茶和用b茶具泡龍井茶 public ...

TypeScript設計模式之門面 介面卡

看看用typescript怎樣實現常見的設計模式,順便複習一下。學模式最重要的不是記uml,而是知道什麼模式可以解決什麼樣的問題,在做專案時碰到問題可以想到用哪個模式可以解決,uml忘了可以查,思想記住就好。這裡盡量用原創的,實際中能碰到的例子來說明模式的特點和用處。介面卡模式的目的主要在於解決介面...