軟體設計模式 | 代理模式

閱讀時間約 3 分鐘
代理模式透過封裝原始對象來實現對它的控制和管理,同時不改變它的行為客戶端互動方式,以此介入或增強對原始對象的訪問和操作。
raw-image

關鍵影響

  • 封装:代理模式透過封裝真實對象的操作細節,對客戶端隱藏了對象的複雜性和執行邏輯,同時保護真實對象的內部狀態。
  • 控制:代理可以在調用真實對象之前強制實施條件,如訪問權限,確保只有授權用戶可以執行特定操作。
  • 管理:代理可以管理真實對象的生命週期或狀態,例如按需初始化資源(延遲初始化)或在不再需要時處理清理任務。
  • 增強互動:可以集成額外的功能,如操作日誌記錄、結果緩存以提高性能,或添加錯誤處理以增強與真實對象的互動的魯棒性。

應用場景

假設我們正在開發一個資料處理器,確保有權限的使用者能夠執行敏感資料處理。

組件設計:

  • 主題介面(Subject Interface):定義了執行敏感資料處理的抽象層,這是代理和真實對象共同實現的介面。
  • 真實主體(Real Subject):這是實際的對象,負責實現處理敏感資料的具體邏輯。
  • 代理(Proxy):代理對象,用於執行前置檢查,如驗證用戶權限,然後根據檢查結果決定是否允許訪問真實主體。
from abc import ABC, abstractmethod

# 主題介面 - 敏感資料處理介面
class SensitiveOperation(ABC):
@abstractmethod
def process_sensitive_data(self):
pass

# 真實主體 - 實作敏感資料處理邏輯​
class DataProcessor(SensitiveOperation):
def process_sensitive_data(self):
print("Processing sensitive data...")

# 代理 - 判斷使用者是否有權限使用真實主體來處理敏感資料
class ProxyDataProcessor(SensitiveOperation):
def __init__(self, user_permissions):
self.permissions = user_permissions
self.data_processor = DataProcessor()

def process_sensitive_data(self):
if 'can_process_sensitive' in self.permissions:
self.data_processor.process_sensitive_data()
else:
print("Access denied: insufficient permissions.")

結論

透過使用代理模式,我們分離權限檢查邏輯敏感資料處理邏輯,使得程式碼更加清晰且容易維護。

此外,這種模式也增強了系統的安全性,因為它為敏感資料處理提供了額外的保護層。在實際應用中,這種模式適用於訪問數據庫、修改系統配置或任何需要細緻權限控制的場景。

66會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
留言0
查看全部
發表第一個留言支持創作者!
再寫5分鐘 的其他內容
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
書名:《解構顧客價值鏈:拆解消費者決策流程,發現商機切入點,用需求驅動設計新商業模式》 本書吸引我的地方是,談到許多零售業遇到的挑戰與現況,也曾經是我所遇到的!​主題談的是顧客價值鏈運,作者舉了非常多零售產業的真實案例,但是往下深入挖掘,在談是商業模式的創新。 ​
MVC是一種物件導向設計模式,將應用程式分成Model、View和Controller。是在1979年被提出,主要是要解決下列問題: 維護「長存儲存媒體」(Persistent Storage)的資料 維護執行流程的邏輯控制 顯示使用者所需的資訊和使用介面 Model 實作儲存應用程式
Thumbnail
Hi, 大家好,我是茶桁。 上一节课中,我们讲解了面向对象中的一些高阶应用,给大家介绍了一些魔术方法。并在最后,我们预告这节课内容会讲解描述符和设计模式。 好了,让我们开始吧。 描述符 这个玩意,怎么讲合适呢?这么说吧,当某一个类中,包含了三个魔术方法(__get__, __set__, _
Thumbnail
所有的 CSS 設計模式都是為了維持可讀性、好維護、易擴充這幾個目標,今天就來談談 BEM 設計模式,並搭配 Sass 中的 SCSS 來介紹,並探討在各種情境下該如何使用 BEM。
Thumbnail
MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
Thumbnail
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
K大怎麼建立自己的飛輪,並且持續利用綜效,創造出巨大效益呢?
Thumbnail
我是部落客,也要設計產品服務區嗎? 是的!Winnie建議你在自己的部落格網站上放上自己設計的產品服務區! 有一些人可能會認為自己只是純粹寫部落格分享自己的想法,並尚未準備提供產品或服務,或是認為自己的人氣還不夠,即使推出產品或服務也不會有人購買,所以就不先設計「產品服務區」了,但我還是非常推薦..
Thumbnail
但是德國的集中和組織卻沒有鬥過英國的自由和法國的民主,因為儘管德國組織得更好一些,但是卻抵擋不住英國的海運控制的全世界資源和美國加入以後更大的人力和生產能力。但是德國的組織也確實有它的能力。大致上講,德國人如果是在對方優勢不超過四倍的情況下,德國人至少能打平手。雙方力量相等的情況下,德國人每次都打贏
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
書名:《解構顧客價值鏈:拆解消費者決策流程,發現商機切入點,用需求驅動設計新商業模式》 本書吸引我的地方是,談到許多零售業遇到的挑戰與現況,也曾經是我所遇到的!​主題談的是顧客價值鏈運,作者舉了非常多零售產業的真實案例,但是往下深入挖掘,在談是商業模式的創新。 ​
MVC是一種物件導向設計模式,將應用程式分成Model、View和Controller。是在1979年被提出,主要是要解決下列問題: 維護「長存儲存媒體」(Persistent Storage)的資料 維護執行流程的邏輯控制 顯示使用者所需的資訊和使用介面 Model 實作儲存應用程式
Thumbnail
Hi, 大家好,我是茶桁。 上一节课中,我们讲解了面向对象中的一些高阶应用,给大家介绍了一些魔术方法。并在最后,我们预告这节课内容会讲解描述符和设计模式。 好了,让我们开始吧。 描述符 这个玩意,怎么讲合适呢?这么说吧,当某一个类中,包含了三个魔术方法(__get__, __set__, _
Thumbnail
所有的 CSS 設計模式都是為了維持可讀性、好維護、易擴充這幾個目標,今天就來談談 BEM 設計模式,並搭配 Sass 中的 SCSS 來介紹,並探討在各種情境下該如何使用 BEM。
Thumbnail
MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
Thumbnail
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
K大怎麼建立自己的飛輪,並且持續利用綜效,創造出巨大效益呢?
Thumbnail
我是部落客,也要設計產品服務區嗎? 是的!Winnie建議你在自己的部落格網站上放上自己設計的產品服務區! 有一些人可能會認為自己只是純粹寫部落格分享自己的想法,並尚未準備提供產品或服務,或是認為自己的人氣還不夠,即使推出產品或服務也不會有人購買,所以就不先設計「產品服務區」了,但我還是非常推薦..
Thumbnail
但是德國的集中和組織卻沒有鬥過英國的自由和法國的民主,因為儘管德國組織得更好一些,但是卻抵擋不住英國的海運控制的全世界資源和美國加入以後更大的人力和生產能力。但是德國的組織也確實有它的能力。大致上講,德國人如果是在對方優勢不超過四倍的情況下,德國人至少能打平手。雙方力量相等的情況下,德國人每次都打贏