7-Python與設計模式–適配器模式
一、外包人員系統兼容
假設某公司A與某公司B需要合作,公司A需要訪問公司B的人員信息,但公司A與公司B協議接口不同,
該如何處理?先將公司A和公司B針對各自的人員信息訪問系統封裝了對象接口。
class ACpnStaff:name=""id=""phone=""def __init__(self,id):self.id=iddef getName(self):print "A protocol getName method...id:%s"%self.idreturn self.namedef setName(self,name):print "A protocol setName method...id:%s"%self.idself.name=namedef getPhone(self):print "A protocol getPhone method...id:%s"%self.idreturn self.phonedef setPhone(self,phone):print "A protocol setPhone method...id:%s"%self.idself.phone=phoneclass BCpnStaff:name=""id=""telephone=""def __init__(self,id):self.id=iddef get_name(self):print "B protocol get_name method...id:%s"%self.idreturn self.namedef set_name(self,name):print "B protocol set_name method...id:%s"%self.idself.name=namedef get_telephone(self):print "B protocol get_telephone method...id:%s"%self.idreturn self.telephonedef set_telephone(self,telephone):print "B protocol get_name method...id:%s"%self.idself.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、適配器模式與原配接口相比,畢竟增加了一層調用關系,所以,在設計系統時,不要使用適配器模式。