假設某公司a與某公司b需要合作,公司a需要訪問公司b的人員資訊,但公司a與公司b協議介面不同,該如何處理?先將公司a和公司b針對各自的人員資訊訪問系統封裝了物件介面。
class acpnstaff:
name=""
id=""
phone=""
def __init__(self,id):
self.id=id
def getname(self):
print "a protocol getname method...id:%s"%self.id
return self.name
def setname(self,name):
print "a protocol setname method...id:%s"%self.id
self.name=name
def getphone(self):
print "a protocol getphone method...id:%s"%self.id
return self.phone
def setphone(self,phone):
print "a protocol setphone method...id:%s"%self.id
self.phone=phone
class bcpnstaff:
name=""
id=""
telephone=""
def __init__(self,id):
self.id=id
def get_name(self):
print "b protocol get_name method...id:%s"%self.id
return self.name
def set_name(self,name):
print "b protocol set_name method...id:%s"%self.id
self.name=name
def get_telephone(self):
print "b protocol get_telephone method...id:%s"%self.id
return self.telephone
def set_telephone(self,telephone):
print "b protocol get_name method...id:%s"%self.id
self.telephone=telephone
為在a公司平台復用b公司介面,直接呼叫b公司人員介面是個辦法,但會對現在業務流程造成不確定的風險。為減少耦合,規避風險,我們需要乙個幫手,就像是轉換電器電壓的介面卡一樣,這個幫手就是協議和介面轉換的介面卡。介面卡構造如下:
class cpnstaffadapter:
b_cpn=""
def __init__(self,id):
self.b_cpn=bcpnstaff(id)
def getname(self):
return self.b_cpn.get_name()
def getphone(self):
return self.b_cpn.get_telephone()
def setname(self,name):
self.b_cpn.set_name(name)
def setphone(self,phone):
self.b_cpn.set_telephone(phone)
介面卡將b公司人員介面封裝,而對外介面形式與a公司人員介面一致,達到用a公司人員介面訪問b公司人員資訊的效果。
業務示例如下:
if __name__=="__main__":
acpn_staff=acpnstaff("123")
acpn_staff.setname("x-a")
acpn_staff.setphone("10012345678")
print "a staff name:%s"%acpn_staff.getname()
print "a staff phone:%s"%acpn_staff.getphone()
bcpn_staff=cpnstaffadapter("456")
bcpn_staff.setname("y-b")
bcpn_staff.setphone("99987654321")
print "b staff name:%s"%bcpn_staff.getname()
print "b staff phone:%s"%bcpn_staff.getphone()
列印如下:a protocol setname method...id:123
a protocol setphone method...id:123
a protocol getname method...id:123
a staff name:x-a
a protocol getphone method...id:123
a staff phone:10012345678
b protocol set_name method...id:456
b protocol get_name method...id:456
b protocol get_name method...id:456
b staff name:y-b
b protocol get_telephone method...id:456
b staff phone:99987654321
介面卡模式定義如下:將乙個類的介面變換成客戶端期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。介面卡模式和裝飾模式有一定的相似性,都起包裝的作用,但二者本質上又是不同的,裝飾模式的結果,是給乙個物件增加了一些額外的職責,而介面卡模式,則是將另乙個物件進行了「偽裝」。
介面卡可以認為是對現在業務的補償式應用,所以,盡量不要在設計階段使用介面卡模式,在兩個系統需要相容時可以考慮使用介面卡模式。
優點:1、介面卡模式可以讓兩個介面不同,甚至關係不大的兩個類一起執行;
2、提高了類的復用度,經過「偽裝」的類,可以充當新的角色;
3、介面卡可以靈活「拆卸」。
應用場景:
1、不修改現有介面,同時也要使該介面適用或相容新場景業務中,適合使用介面卡模式。例如,在乙個嵌入式系統中,原本要將資料從flash讀入,現在需要將資料從磁碟讀入,這種情況可以使用介面卡模式,將從磁碟讀入資料的介面進行「偽裝」,以從flash中讀資料的介面形式,從磁碟讀入資料。
1、介面卡模式與原配介面相比,畢竟增加了一層呼叫關係,所以,在設計系統時,不要使用介面卡模式。
設計模式之介面卡模式(類介面卡模式)
介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...
設計模式之結構類模式 介面卡模式
介面卡模式 adapter pattern 又叫做變壓器模式,也叫做包裝模式。包裝模式還包括裝飾模式。定義 將乙個類的介面變換成客戶端所期待的另乙個介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。通用類圖 target目標角色 該角色定義把其他類轉換為何種介面,也就是我們期望的介...
設計模式 介面卡模式 類介面卡 物件介面卡
乙個小例子,便於理解,上 這是我們造的。現在想用這個方法。public class adaptee 類介面卡。對我們想要的方法封裝一下,target就能像之前一樣,呼叫request方法即可。public class adapter1 extends adaptee implements targe...