Python設(shè)計模式之代理模式實(shí)例
翻墻常用的方式就是使用代理(Proxy),其基本過程如下:
瀏覽器<-->代理服務(wù)器<-->服務(wù)器
如果瀏覽器請求不到服務(wù)器,或者服務(wù)器無法響應(yīng)瀏覽器,我們可以設(shè)定將瀏覽器的請求傳遞給代理服務(wù)器,代理服務(wù)器將請求轉(zhuǎn)發(fā)給服務(wù)器。然后,代理服務(wù)器將服務(wù)器的響應(yīng)內(nèi)容傳遞給瀏覽器。當(dāng)然,代理服務(wù)器在得到請求或者響應(yīng)內(nèi)容的時候,本身也可以做些處理,例如緩存靜態(tài)內(nèi)容以加速,或者說提取請求內(nèi)容或者響應(yīng)內(nèi)容做些正當(dāng)或者不正當(dāng)?shù)姆治?。這種翻墻方式,就是設(shè)計模式中代理模式(Proxy Pattern)的一個具體例子。
維基百科對代理模式做了以下解釋:
In computer programming, the proxy pattern is a software design pattern. A proxy, in its most general form, is a class functioning as an interface to something else. The proxy could interface to anything: a network connection, a large object in memory, a file, or some other resource that is expensive or impossible to duplicate.
基于面向過程實(shí)現(xiàn)的代理模式
下面是一段體現(xiàn)該設(shè)計模式中心的面向過程的python代碼:
def hello():
print 'hi, i am hello'
def proxy():
print 'prepare....'
hello()
print 'finish....'
if __name__ == '__main__':
proxy()
運(yùn)行結(jié)果:
prepare....
hi, i am hello
finish....
有沒有想到裝飾器?
基于面向?qū)ο髮?shí)現(xiàn)的代理模式
class AbstractSubject(object):
def __init__(self):
pass
def request(self):
pass
class RealSubject(AbstractSubject):
def __init__(self):
pass
def request(self):
print 'hi, i am RealSubject'
class ProxySubject(AbstractSubject):
def __init__(self):
self.__rs = RealSubject()
def request(self):
self.__beforeRequest()
self.__rs.request()
self.__afterRequest()
def __beforeRequest(self):
print 'prepare....'
def __afterRequest(self):
print 'finish....'
if __name__ == '__main__':
subject = ProxySubject()
subject.request()
如果RealSubject的初始化函數(shù)init有參數(shù),代理類ProxySubject可以作兩種方式的修改: 第一種: ProxySubject的init方法同樣也有參數(shù),初始化代理類的時候?qū)⒊跏蓟瘏?shù)傳遞給RealSubject。 第二種: 將ProxySubject的init方法改為:
def __init__(self):
self.__rs = None
將ProxySubject的request方法改為:
def request(self, *args, **kwargs):
if self.__rs == None:
self.__rs = RealSubject(*args, **kwargs)
self.__beforeRequest()
self.__rs.request()
self.__afterRequest()
的類似形式。
相關(guān)文章
使用matlab或python將txt文件轉(zhuǎn)為excel表格
這篇文章主要介紹了matlab或python代碼將txt文件轉(zhuǎn)為excel表格,本文通過matlab代碼和python 代碼給大家詳細(xì)介紹,需要的朋友可以參考下2019-11-11python實(shí)現(xiàn)12306火車票查詢器
這篇文章主要介紹了python實(shí)現(xiàn)12306火車票查詢器,需要的朋友可以參考下2017-04-04Python入門教程(三十八)Python的NumPy庫簡介
這篇文章主要介紹了Python入門教程(三十八)Python的NumPy庫簡介,NumPy 是用于處理數(shù)組的 python 庫,它還擁有在線性代數(shù)、傅立葉變換和矩陣領(lǐng)域中工作的函數(shù),需要的朋友可以參考下2023-05-05Python中單引號、雙引號和三引號具體的用法及注意點(diǎn)
這篇文章主要給大家介紹了關(guān)于Python中單引號、雙引號和三引號具體的用法及注意點(diǎn)的相關(guān)資料,Python中單引號、雙引號、三引號中使用常常困惑,想弄明白這三者相同點(diǎn)和不同點(diǎn),需要的朋友可以參考下2023-07-07Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法
這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法,涉及Python列表推導(dǎo)式、生成器表達(dá)式及filter()函數(shù)相關(guān)使用技巧,需要的朋友可以參考下2018-03-03