結構類設計模式(7種)之適配器模式

一、外包人員系統兼容

假設某公司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

 

二、適配器模式

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


f1.png


適配器可以認爲是對現在業務的補償式應用,所以,儘量不要在設計階段使用適配器模式,在兩個系統需要兼容時可以考慮使用適配器模式。

 

三、適配器模式的優點和使用場景

優點:

1、適配器模式可以讓兩個接口不同,甚至關係不大的兩個類一起運行;
2、提高了類的複用度,經過“僞裝”的類,可以充當新的角色;
3、適配器可以靈活“拆卸”。

應用場景:

1、不修改現有接口,同時也要使該接口適用或兼容新場景業務中,適合使用適配器模式。例如,在一個嵌入式系統中,原本要將數據從Flash讀入,現在需要將數據從磁盤讀入,這種情況可以使用適配器模式,將從磁盤讀入數據的接口進行“僞裝”,以從Flash中讀數據的接口形式,從磁盤讀入數據。

 

四、適配器模式的缺點

1、適配器模式與原配接口相比,畢竟增加了一層調用關係,所以,在設計系統時,不要使用適配器模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章