1. 程式人生 > >7-Python與設計模式--介面卡模式

7-Python與設計模式--介面卡模式

一、外包人員系統相容

假設某公司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、介面卡模式與原配介面相比,畢竟增加了一層呼叫關係,所以,在設計系統時,不要使用介面卡模式。