結構型設計模式:主要用來處理乙個系統中不同實體之間關係,即將類或者物件組合在一起,重新組成為一種新的、功能更強大的結構。
類結構型模式:多個類組合而成的系統。
物件結構型模式:在乙個類中定義另外乙個類的例項,通過類與物件的組合形成更大的系統,可以通過類中的物件屬性去呼叫這個物件的方法。
介面卡模式:也是屬於設計模式中的結構型模式。
介面卡模式主要用於 幫助我們實現兩個不相容介面之間的相容。
1、物件結構型介面卡示例
假設存在一套舊的系統executecmd類,用來執行一些系統命令。
importsubprocess
class
executecmd:
def__init__
(self, cmd):
self.cmd =cmd
defcmd_exe(self):
result = ""
result_code =0
try:
result = subprocess.check_output(self.cmd, shell=true)
except
subprocess.calledprocesserror as e:
result_code = 1
return result, result_code
客戶端要執行命令的時候,只需要呼叫這個類的例項方法cmd_exe即可:
old_obj = executecmd("ls -l
").cmd_exe()
現在有乙個新的系統,仍然是用來執行一些系統命令,但是新的呼叫方式改變了。
classnewcmd:
def__init__
(self, cmd):
self.cmd =cmd
defrun_cmd(self):
result = ""
result_code =0
try:
result = subprocess.check_output(self.cmd, shell=true)
except
subprocess.calledprocesserror as e:
result_code = 1
return result, result_code
新的呼叫方式是:
new_obj = newcmd("ls -l
").run_cmd()
假設由於新系統支援的命令更多,我們想要把新系統也提供給客戶端使用,但是客戶端只知道使用某個例項的cmd_exe方法,並不知道新系統的呼叫方式改變了。
在不改變新系統newcmd類的前提下,我們該如何做才能讓客戶端仍然能正常呼叫呢?
此時就需要用到介面卡!我們可以建立乙個通用的adapter類,將一些不同介面的物件適配到乙個統一介面中。
在初始化方法init()中,用乙個屬性obj把我們想要適配的物件儲存下來, adapted_methods是乙個字典,用於轉換介面,key是客戶端要呼叫的方法,value是想要適配的物件真正被呼叫的方法。
介面卡類定義如下:
classadapter:
def__init__
(self, obj, adapted_methods):
self.obj =obj
self.
__dict__
.update(adapted_methods)
def__getattr__
(self, item):
return self.obj.item
使用方法如下:
#舊介面可以不適配
old_obj = executecmd("
ls -l
").cmd_exe()
#新介面需要進行適配
new_obj = newcmd("
ls -l")
trans_obj = adapter(new_obj, dict(cmd_exe=new_obj.run_cmd))
#適配完成後,就可以跟舊系統一樣使用cmd_exe執行命令
trans_obj.cmd_exe()
完整的**展示
importsubprocess
class
executecmd:
def__init__
(self, cmd):
self.cmd =cmd
defcmd_exe(self):
result = ""
result_code =0
try:
result = subprocess.check_output(self.cmd, shell=true)
except
subprocess.calledprocesserror as e:
result_code = 1
return
result, result_code
class
newcmd:
def__init__
(self, cmd):
self.cmd =cmd
defrun_cmd(self):
result = ""
result_code =0
try:
result = subprocess.check_output(self.cmd, shell=true)
except
subprocess.calledprocesserror as e:
result_code = 1
return
result, result_code
class
adapter:
def__init__
(self, obj, adapted_methods):
self.obj =obj
self.
__dict__
.update(adapted_methods)
def__getattr__
(self, item):
return
self.obj.item
#舊介面可以不適配
old_obj = executecmd("
calc
").cmd_exe()
#新介面需要進行適配
new_obj = newcmd("
calc")
# 這裡將新系統的run_cmd方法適配成舊系統的cmd_exe方法trans_obj = adapter(new_obj, dict(cmd_exe=new_obj.run_cmd))
#適配完成後,就可以跟舊系統一樣使用cmd_exe執行命令
trans_obj.cmd_exe()
2、類結構型介面卡示例
如果我們希望直接使用乙個新的類去適配舊系統的介面時,也可以使用類結構型介面卡,方法如下:
建立乙個新的類
繼承需要進行轉換的類
在新的類中實現舊系統的介面
importsubprocess
class
executecmd:
def__init__
(self, cmd):
self.cmd =cmd
defcmd_exe(self):
result = ""
result_code =0
try:
result = subprocess.check_output(self.cmd, shell=true)
except
subprocess.calledprocesserror as e:
result_code = 1
return
result, result_code
class
newcmd:
def__init__
(self, cmd):
self.cmd =cmd
defrun_cmd(self):
result = ""
result_code =0
try:
result = subprocess.check_output(self.cmd, shell=true)
except
subprocess.calledprocesserror as e:
result_code = 1
return
result, result_code
class
adapter(newcmd):
"""繼承新系統的類
"""def
cmd_exe(self):
"""直接在介面卡中實現舊系統的介面
"""return
self.run_cmd()
#舊介面
old_obj = executecmd("
calc
").cmd_exe()
#新介面需要進行適配
new_obj = adapter("
calc
").cmd_exe()
設計模式之介面卡模式(類介面卡模式)
介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...
Python介面卡模式
存在一套舊系統,裡面包含human和synthesizer類,如下 class synthesizer def init self,name self.name name def str self return the synthesizer format self.name defplay sel...
python 介面卡模式
所謂介面卡模式是指是一種介面適配技術,它可通過某個類來使用另乙個介面與之不相容的類,運用此模式,兩個類的介面都無需改動。存在一套舊系統,裡面包含 human 和 synthesizer 類,如下 class synthesizer def init self,name self.name name ...