国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python設(shè)計模式之代理模式實例

2019-11-25 18:25:58
字體:
供稿:網(wǎng)友

翻墻常用的方式就是使用代理(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)的一個具體例子。

維基百科對代理模式做了以下解釋:

復(fù)制代碼 代碼如下:

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.

基于面向過程實現(xiàn)的代理模式

下面是一段體現(xiàn)該設(shè)計模式中心的面向過程的python代碼:

復(fù)制代碼 代碼如下:

def hello():
    print 'hi, i am hello'

def proxy():
    print 'prepare....'
    hello()
    print 'finish....'

if __name__ == '__main__':
    proxy()


運行結(jié)果:
復(fù)制代碼 代碼如下:

prepare....
hi, i am hello
finish....

有沒有想到裝飾器?


基于面向?qū)ο髮崿F(xiàn)的代理模式

復(fù)制代碼 代碼如下:

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方法改為:

復(fù)制代碼 代碼如下:

def __init__(self):
    self.__rs = None

將ProxySubject的request方法改為:
復(fù)制代碼 代碼如下:

def request(self, *args, **kwargs):
    if self.__rs == None:
        self.__rs = RealSubject(*args, **kwargs)
    self.__beforeRequest()
    self.__rs.request()
    self.__afterRequest()

的類似形式。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 建始县| 邯郸县| 凤庆县| 方城县| 三河市| 汨罗市| 雷州市| 垦利县| 天等县| 盐亭县| 上林县| 健康| 宜君县| 友谊县| 铜山县| 尉犁县| 盈江县| 浦城县| 务川| 昌平区| 沂南县| 克拉玛依市| 滨州市| 赞皇县| 扬州市| 鄄城县| 汉源县| 昆明市| 鸡泽县| 如皋市| 昌平区| 讷河市| 平乡县| 丰台区| 吐鲁番市| 灵台县| 岳西县| 深水埗区| 临桂县| 屏东市| 潍坊市|