Python與設計模式--代理模式

5-Python與設計模式–代理模式

一、網絡服務器配置白名單

代理模式是一種使用頻率非常高的模式,在多個著名的開源軟件和當前多個著名的互聯網產品后
臺程序中都有所應用。下面我們用一個抽象化的簡單例子,來說明代理模式。

首先,構造一個網絡服務器:

#該服務器接受如下格式數據,addr代表地址,content代表接收的信息內容
info_struct=dict()
info_struct["addr"]=10000
info_struct["content"]=""
class Server:content=""def recv(self,info):passdef send(self,info):passdef show(self):pass
class infoServer(Server):def recv(self,info):self.content=inforeturn "recv OK!"def send(self,info):passdef show(self):print "SHOW:%s"%self.content

infoServer有接收和發送的功能,發送功能由于暫時用不到,保留。另外新加一個接口show,
用來展示服務器接收的內容。接收的數據格式必須如info_struct所示,服務器僅接受info_struct的
content字段。那么,如何給這個服務器設置一個白名單,使得只有白名單里的地址可以
訪問服務器 呢?修改Server結構是個方法,但這顯然不符合軟件設計原則中的單一職責原則。
在此 基礎之上, 使用代理,是個不錯的方法。代理配置如下:

class serverProxy:pass
class infoServerProxy(serverProxy):server=""def __init__(self,server):self.server=serverdef recv(self,info):return self.server.recv(info)def show(self):self.server.show()class whiteInfoServerProxy(infoServerProxy):white_list=[]def recv(self,info):try:assert type(info)==dictexcept:return "info structure is not correct"addr=info.get("addr",0)if not addr in self.white_list:return "Your address is not in the white list."else:content=info.get("content","")return self.server.recv(content)def addWhite(self,addr):self.white_list.append(addr)def rmvWhite(self,addr):self.white_list.remove(addr)def clearWhite(self):self.white_list=[]

代理中有一個server字段,控制代理的服務器對象,infoServerProxy充當Server的直接接口代理,
而whiteInfoServerProxy直接繼承了infoServerProxy對象,同時加入了white_list和對白名單的操作。
這樣,在場景中通過對白名單代理的訪問,就可以實現服務器的白名單訪問了。

if  __name__=="__main__":info_struct = dict()info_struct["addr"] = 10010info_struct["content"] = "Hello World!"info_server = infoServer()info_server_proxy = whiteInfoServerProxy(info_server)print info_server_proxy.recv(info_struct)info_server_proxy.show()info_server_proxy.addWhite(10010)print info_server_proxy.recv(info_struct)info_server_proxy.show()

打印如下:

Your address is not in the white list. SHOW: recv OK! SHOW:Hello
World!

二、代理模式

代理模式定義如下:為某對象提供一個代理,以控制對此對象的訪問和控制。代理模式在使用過程中,
應盡量對抽象主題類進行代理,而盡量不要對加過修飾和方法的子類代理。如上例中,
如果有一個xServer繼承了Server,并新加了方法xMethod,xServer的代理應以Server為主題進行設計,
而盡量不要以xServer為主題,以xServer為主題的代理可以從ServerProxy繼承并添加對應的方法。
JAVA中,講到代理模式,不得不會提到動態代理。動態代理是實現AOP(面向切面編程)的重要實現手段。
而在Python中,很少會提到動態代理,而AOP則會以另一種模式實現:裝飾模式。有關AOP的相關內容,
我們會在裝飾模式這一節中進行說明。

三、代理模式的優點和應用場景

3.1 優點:

1、職責清晰:非常符合單一職責原則,主題對象實現真實業務邏輯,而非本職責的事務,交由代理完成;
2、擴展性強:面對主題對象可能會有的改變,代理模式在不改變對外接口的情況下,可以實現最大程度的擴展;
3、保證主題對象的處理邏輯:代理可以通過檢查參數的方式,保證主題對象的處理邏輯輸入在理想范圍內。

3.2 應用場景:

1、針對某特定對象進行功能和增強性擴展。如IP防火墻、遠程訪問代理等技術的應用;
2、對主題對象進行保護。如大流量代理,安全代理等;
3、減輕主題對象負載。如權限代理等。

四、代理模式的缺點

1、可能會降低整體業務的處理效率和速度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166410.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ssm+vue的企業文檔管理系統(有報告)。Javaee項目,ssm vue前后端分離項目。

演示視頻: ssmvue的企業文檔管理系統(有報告)。Javaee項目,ssm vue前后端分離項目。 項目介紹: 采用M(model)V(view)C(controller)三層體系結構&…

Talk | 牛津大學博士后研究員邊佳旺:SC-DepthV3-動態場景中的自監督單目深度估計

本期為TechBeat人工智能社區第550期線上Talk。 北京時間11月23日(周四)20:00,牛津大學博士后研究員—邊佳旺的Talk已準時在TechBeat人工智能社區開播! 他與大家分享的主題是: “SC-DepthV3:動態場景中的自監督單目深度估計”,介紹…

Vocoder,聲碼器詳解——語音信號處理學習(十)

參考文獻: [1] Vocoder (由助教許博竣同學講授)嗶哩嗶哩bilibili [2] Oord A, Dieleman S, Zen H, et al. Wavenet: A generative model for raw audio[J]. arXiv preprint arXiv:1609.03499, 2016. [3] https://deepmind.com/blog/article/wavenet-generative-mode…

【華為OD機試題】 給出一個區間的集合,請合并所有重疊的區間。

給出一個區間的集合,請合并所有重疊的區間。 示例 1: 輸入: [[1,3],[2,6],[8,10],[15,18]] #輸出: [[1,6],[8,10],[15,18]] 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6]. 示例 2: #輸入: [[1,4],[4,5]] #輸出: [[1,5]] #解釋: 區間 [1,4] 和 [4,5] 可被視…

window.requestAnimationFrame+localStorage+canvas實現跨窗口小球連線效果

文章目錄 前言效果代碼后言 前言 hello world歡迎來到前端的新世界 😜當前文章系列專欄:前端系列文章 🐱?👓博主在前端領域還有很多知識和技術需要掌握,正在不斷努力填補技術短板。(如果出現錯誤,感謝大家…

FPGA----ZCU106使用petalinux 2019.1的第一個app開發

1、petalinux在zcu106上的構建參見前文 FPGA----ZCU106使用petalinux 2019.1(全網最詳)-CSDN博客文章瀏覽閱讀31次。本文完成了Vivado 2019.1版本下的基于ZCU106的全部linux系統移植https://blog.csdn.net/qq_37912811/article/details/1345197352、我們…

Vatee萬騰科技的未來探險:Vatee數字創新的獨特發現

在科技的浩瀚海洋中,Vatee萬騰科技如一艘探險船般,勇敢地駛向未知的數字化領域。這次未來的探險,不僅是一場科技創新的冒險,更是對數字化時代的獨特發現和深刻探討。 Vatee萬騰科技視科技創新為一座高峰,而他們的未來探…

java類中局部變量和成員變量有啥區別?

java類中局部變量和成員變量有啥區別? 舉個例子,我們可以定義一個Person類,其中有兩個成員變量name和age,以及一個構造方法和一個show方法。在構造方法中,我們可以使用this關鍵字來引用成員變量,以區分同名…

基于亞馬遜云科技大語言模型等服務打造企業知識庫

背景 大語言模型是自然語言處理領域的一項重要技術,能夠通過學習大量的文本數據,生成具有語法和意義的自然語言文本。目前大語言模型已經成為了自然語言處理領域的一個熱門話題,引起了廣泛的關注和研究。 知識庫需求在各行各業中普遍存在&a…

《洛谷深入淺出基礎篇》P4715淘汰賽——二叉樹

上鏈接:【深基16.例1】淘汰賽 - 洛谷https://www.luogu.com.cn/problem/P4715 上題干: 題目描述 有 2^n(n≤7)個國家參加世界杯決賽圈且進入淘汰賽環節。已經知道各個國家的能力值,且都不相等。能力值高的國家和能力值…

力扣刷題,兩數之和

1、兩數之和 1、問題描述 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那兩個整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。…

從裸機啟動開始運行一個C++程序(十三)

前序文章請看: 從裸機啟動開始運行一個C程序(十二) 從裸機啟動開始運行一個C程序(十一) 從裸機啟動開始運行一個C程序(十) 從裸機啟動開始運行一個C程序(九) 從裸機啟動開…

uniapp打包的ipa上架到appstore的傻瓜式教程

? 轉載:uniapp打包的ipa上架到appstore的傻瓜式教程 uniapp打包 在HBuilder X編輯器中打開需要打包的項目,然后點擊上面菜單欄中 發行 > 原生App-云打包,對以下彈出的彈窗進行內容填寫 ? 填寫完成以后,點擊打包操作 ? ? …

自定義責任鏈Filter實現

核心接口 Filter package com.xxx.arch.mw.nbp.common.extension;import com.xxx.commons.data.domain.Result;/*** date 2023/08/25*/ public interface Filter {Result invoke(final Invoker invoker, final Invocation invocation); } Invoker package com.xxx.arch.mw.…

修改mysql的密碼(每一步都圖文解釋哦)

當你想要連接本機數據庫時,是不是有可能突然忘記了自己的數據庫密碼? 在此文中,我們來詳細解決一下如何去修改自己的數據庫密碼,并使用Navicat來連接測試 1.停止mysql服務 打開終端,鍵入命令,將mysql服務先停止掉,…

設置滾動條樣式

滾動條樣式&#xff1a; 下面是代碼&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8"><title>CSS3自定義滾動條</title><style>header {font-family: Lobster, cursive;text-align: c…

亞馬遜云科技向量數據庫助力生成式AI成功落地實踐探秘(二)

向量數據庫選擇哪種近似搜索算法&#xff0c;選擇合適的集群規模以及集群設置調優對于知識庫的讀寫性能也十分關鍵&#xff0c;主要需要考慮以下幾個方面&#xff1a; 向量數據庫算法選擇 在 OpenSearch 里&#xff0c;提供了兩種 k-NN 的算法&#xff1a;HNSW (Hierarchical…

基于STM32設計的智能防盜單車鎖(馬蹄鎖)設計_升級版

1. 前言 隨著共享單車和自行車的普及,人們對自行車的安全和便利性提出了更高的要求。智能防盜馬蹄鎖是一種基于 STM32 單片機的智能鎖,可以通過手機藍牙實現開鎖和關鎖控制,同時具備 GPRS 防盜預警功能,提高了自行車的安全性和使用便利性。 通過智能防盜馬蹄鎖,用戶可以…

YOLOv5和改進后模型的result.csv文件對比

import pandas as pd import matplotlib.pyplot as plt# 讀取CSV文件 df1 pd.read_csv(rE:\xianyu\yolo.csv) df2 pd.read_csv(rE:\xianyu\final.csv)# 獲取列名 columns df1.columns# 循環繪制每一列的對比圖 for column in columns:plt.figure(figsize(8, 5))plt.plot(df1…

技術分享 | 在 IDE 插件開發中接入 JCEF 框架

項目背景 當前的開發環境存在多種不同語言的 IDE&#xff0c;如 JetBrains 全家桶、Eclipse、Android Studio 和 VS Code 等等。由于每個 IDE 各有其特定的語言和平臺要求&#xff0c;因此開發 IDE 插件時&#xff0c;需要投入大量資源才能盡可能覆蓋大部分工具。同時&#xf…