代理設(shè)計(jì)模式包含一個(gè)新對(duì)象,稱(chēng)為“代理”,代替被稱(chēng)為“真實(shí)主體”的現(xiàn)有對(duì)象。 由真實(shí)主體創(chuàng)建的代理對(duì)象必須位于相同的接口上,以便不讓客戶(hù)端知道使用代理來(lái)代替真實(shí)對(duì)象。 客戶(hù)端向代理生成的請(qǐng)求將通過(guò)真實(shí)主體傳遞。
代理模式的UML表示如下 -

現(xiàn)在讓我們來(lái)看看如何實(shí)現(xiàn)代理模式。參考以下實(shí)現(xiàn)代碼 -
class Image:
def __init__( self, filename ):
self._filename = filename
def load_image_from_disk( self ):
print("loading " + self._filename )
def display_image( self ):
print("display " + self._filename)
class Proxy:
def __init__( self, subject ):
self._subject = subject
self._proxystate = None
class ProxyImage( Proxy ):
def display_image( self ):
if self._proxystate == None:
self._subject.load_image_from_disk()
self._proxystate = 1
print("display " + self._subject._filename )
proxy_image1 = ProxyImage ( Image("HiRes_10Mb_Photo1") )
proxy_image2 = ProxyImage ( Image("HiRes_10Mb_Photo2") )
proxy_image1.display_image() # loading necessary
proxy_image1.display_image() # loading unnecessary
proxy_image2.display_image() # loading necessary
proxy_image2.display_image() # loading unnecessary
proxy_image1.display_image() # loading unnecessary
執(zhí)行上述程序生成以下輸出 -

代理模式設(shè)計(jì)有助于復(fù)制創(chuàng)建的圖像。 display_image()函數(shù)有助于檢查值是否在命令提示符下打印。