設計模式之介面卡(變壓器)模式

2021-09-02 16:17:23 字數 2870 閱讀 6819

介面卡(變壓器)模式:把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據引數返還乙個合適的例項給客戶端。

中國市電220v,如果買個國產筆記本去國外,國外電壓110v如何使用呢?幸好有了筆記本電源介面卡幫忙

* created by intellij idea. 

* date: 2008-8-2 14:43:46 

* 源角色 

public class adaptee

public void 念經(){}

public void 打坐(){}

public void 撞鐘(){}

public void 習武(){}

public string getname()fd = fdobj; 

public fileinputstream(file file) throws filenotfoundexception {

string name = file.getpath();

securitymanager security = system.getsecuritymanager();

if (security != null) {

security.checkread(name);

fd = new filedescriptor();

open(name);

//其它**

同樣地,在 outputstream 型別中,所有的原始流處理器都是介面卡類。bytearrayoutputstream 繼承了 outputstream 型別,同時持有乙個對 byte 陣列的引用。它乙個 byte 陣列的介面適配成 outputstring 型別的介面,因此也是乙個物件形式的介面卡模式的應用。

fileoutputstream 繼承了 outputstream 型別,同時持有乙個對 filediscriptor 物件的引用。這是乙個將 filediscriptor 介面適配成 outputstream 介面形式的物件型介面卡模式。

介面卡模式使用注意事項

充當介面卡角色的類就是:實現已有介面的抽象類;

為什麼要用抽象類?此類是不要被例項化的。而只充當介面卡的角色,也就為其子類提供了乙個共同的介面,但其子類又可以將精力只集中在其感興趣的地方。

介面卡模式中被適配的介面 adaptee 和適配成為的介面 target 是沒有關聯的,adaptee 和 target 中的方法既可以是相同的,也可以是不同的。

介面卡在適配的時候,可以適配多個 apaptee,也就是說實現某個新的 target 的功能的時候,需要呼叫多個模組的功能,適配多個模組的功能才能滿足新介面的要求。

介面卡有乙個潛在的問題,就是被適配的物件不再相容 adaptee 的介面,因為介面卡只是實現了 target 的介面。這導致並不是所有 adaptee 物件可以被使用的地方都能是使用介面卡,雙向介面卡解決了這個問題。

優點介面卡模式也是一種包裝模式,它與裝飾模式同樣具有包裝的功能,此外,物件介面卡模式還具有委託的意思。總的來說,介面卡模式屬於補償模式,專用來在系統後期擴充套件、修改時使用。

缺點過多的使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是 a 介面,其實內部被適配成了 b 介面的實現,乙個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用介面卡,而是直接對系統進行重構。

介面卡模式應用場景

在軟體開發中,也就是系統的資料和行為都正確,但介面不相符時,我們應該考慮用介面卡,目的是使控制範圍之外的乙個原有物件與某個介面匹配。介面卡模式主要應用於希望復用一些現存的類,但是介面又與復用環境要求不一致的情況。比如在需要對早期**復用一些功能等應用上很有實際價值。適用場景大致包含三類:

1、已經存在的類的介面不符合我們的需求;

2、建立乙個可以復用的類,使得該類可以與其他不相關的類或不可預見的類(即那些介面可能不一定相容的類)協同工作;

3、在不對每乙個都進行子類化以匹配它們的介面的情況下,使用一些已經存在的子類。

類介面卡和物件介面卡的權衡

類介面卡使用物件繼承的方式,是靜態的定義方式;而物件介面卡使用物件組合的方式,是動態組合的方式。

對於類介面卡,由於介面卡直接繼承了adaptee,使得介面卡不能和adaptee的子類一起工作,因為繼承是靜態的關係,當介面卡繼承了adaptee後,就不可能再去處理  adaptee的子類了。

對於物件介面卡,乙個介面卡可以把多種不同的源適配到同乙個目標。換言之,同乙個介面卡可以把源類和它的子類都適配到目標介面。因為物件介面卡採用的是物件組合的關係,只要物件型別正確,是不是子類都無所謂。

對於類介面卡,介面卡可以重定義adaptee的部分行為,相當於子類覆蓋父類的部分實現方法。

對於物件介面卡,要重定義adaptee的行為比較困難,這種情況下,需要定義adaptee的子類來實現重定義,然後讓介面卡組合子類。雖然重定義adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用於所有的源。

對於類介面卡,僅僅引入了乙個物件,並不需要額外的引用來間接得到adaptee。

對於物件介面卡,需要額外的引用來間接得到adaptee。

建議盡量使用物件介面卡的實現方式,多用合成/聚合、少用繼承。當然,具體問題具體分析,根據需要來選用實現方式,最適合的才是最好的。

介面卡模式的優點

更好的復用性

系統需要使用現有的類,而此類的介面不符合系統的需要。那麼通過介面卡模式就可以讓這些功能得到更好的復用。

更好的擴充套件性

在實現介面卡功能的時候,可以呼叫自己開發的功能,從而自然地擴充套件系統的功能。

介面卡模式的缺點

過多的使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是a介面,其實內部被適配成了b介面的實現,乙個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用介面卡,而是直接對系統進行重構。

介面卡模式(變壓器模式)

為什麼要 用介面卡模式。就是把兩個完全不關聯或者不相同的類糾合一起時才使用這個模式。這個模式涉及到角色 源角色 需要適配的角色。目標角色 期待使用的介面。介面卡角色 把源角色轉化成目標角色。這個是模式的核心。著重轉化功能。介面卡模式分兩種情況 類的介面卡模式和物件的介面卡模式 首先來講講類的介面卡模...

設計模式之介面卡模式(類介面卡模式)

介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...

設計模式之 介面卡模式

1,介面卡模式把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法一起工作的兩個類能夠在一起工作 2,介面卡模式有兩種 1 類的介面卡模式 介面卡類繼承源類 這樣介面卡類就繼承了源類有的方法 並實現目標介面,實現在源類中沒有而在介面中有的方法,從而實現介面卡類有目標介面的所有方...