Python之介面卡模式

2022-09-08 07:06:17 字數 4754 閱讀 5822

結構型設計模式:主要用來處理乙個系統中不同實體之間關係,即將類或者物件組合在一起,重新組成為一種新的、功能更強大的結構。

類結構型模式:多個類組合而成的系統。

物件結構型模式:在乙個類中定義另外乙個類的例項,通過類與物件的組合形成更大的系統,可以通過類中的物件屬性去呼叫這個物件的方法。

介面卡模式:也是屬於設計模式中的結構型模式。

介面卡模式主要用於 幫助我們實現兩個不相容介面之間的相容。

1、物件結構型介面卡示例

假設存在一套舊的系統executecmd類,用來執行一些系統命令。

import

subprocess

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()

現在有乙個新的系統,仍然是用來執行一些系統命令,但是新的呼叫方式改變了。

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

新的呼叫方式是:

new_obj = newcmd("

ls -l

").run_cmd()

假設由於新系統支援的命令更多,我們想要把新系統也提供給客戶端使用,但是客戶端只知道使用某個例項的cmd_exe方法,並不知道新系統的呼叫方式改變了。

在不改變新系統newcmd類的前提下,我們該如何做才能讓客戶端仍然能正常呼叫呢?

此時就需要用到介面卡!我們可以建立乙個通用的adapter類,將一些不同介面的物件適配到乙個統一介面中。

在初始化方法init()中,用乙個屬性obj把我們想要適配的物件儲存下來, adapted_methods是乙個字典,用於轉換介面,key是客戶端要呼叫的方法,value是想要適配的物件真正被呼叫的方法。

介面卡類定義如下:

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("

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()

完整的**展示

import

subprocess

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、類結構型介面卡示例

如果我們希望直接使用乙個新的類去適配舊系統的介面時,也可以使用類結構型介面卡,方法如下:

建立乙個新的類

繼承需要進行轉換的類

在新的類中實現舊系統的介面

import

subprocess

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 ...