【設計模式深度剖析】【1】【結構型】【代理模式】| 玩游戲打怪、升級為例加深理解

👈?上一篇:創建型設計模式對比 ? ?|?? 下一篇:裝飾器模式👉?

目 錄

  • 代理模式
  • 定義
    • 英文原話
    • 直譯
    • 如何理解?
  • 3個角色
    • UML類圖
    • 1. 抽象主題(Subject)角色
    • 2. 代理類:代理主題(Proxy Subject)角色
    • 3. 被代理類:真實主題(Real Subject)角色
    • 代碼示例
      • 1. 真實主題,被代理類
      • 2. 抽象主題
      • 3. 代理類
      • 4. 測試類
  • 代理模式的種類
  • 代理模式的優點
  • 示例解析:玩游戲打怪、升級示例
    • UML類圖
    • 1. 真實主題RealSubject:GamePlayer實現IGamePlayer接口中的方法
    • 抽象主題Subject:IGamePlayer接口對游戲玩家進行抽象
    • 代理主題ProxySubject:GamePlayerProxy是代理類
    • 測試類

代理模式

定義

英文原話

Provide a surrogate or placeholder for another object to control access to it.

直譯

為另一個對象提供代理或占位符以控制對它的訪問

如何理解?

字面上不好理解的話可以結合代碼進一步理解下,從具體實現上分析:

抽象主題角色,是對被代理類的抽象,被代理類就看作是對抽象主題角色類的實現,被代理類的實現就是核心功能的實現

同時,代理對象中持有被代理對象的引用,

代理類也實現了被代理類相同的接口,

這樣,通過代理類可以增強被代理類的邏輯,

在被代理對象的邏輯前后可以增加一些邏輯,比如獲取請求參數,添加日志等,這些非核心的邏輯,可以在代理類中進行增強。

代理模式應用非常廣泛,大到一個系統框架、企業平臺,小到事務處理、代碼片段,隨處可見代理模式的使用,例如,Java RMI的遠程調用就是一種代理模式的應用,AOP也可以通過代理模式實現。

3個角色

UML類圖

proxy.png

1. 抽象主題(Subject)角色

該角色是真實主題和代理主題的共同接口,以便在任何可以使用真實主題的地方都可以使用代理主題。

2. 代理類:代理主題(Proxy Subject)角色

也叫做委托類、代理類,該角色負責控制對真實主題的引用,負責在需要的時候創建或刪除真實主題對象,并且在真實主題角色處理完畢前后做預處理和善后處理工作。

3. 被代理類:真實主題(Real Subject)角色

該角色也叫做被委托角色、被代理角色,是業務邏輯的具體執行者。

代碼示例

1. 真實主題,被代理類

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;public class Target implements AbstractSubject {@Overridepublic void m1() {System.out.println("target implements. Core business logic");}
}

2. 抽象主題

抽取核心業務邏輯接口方法m1()出來,該方法源自被代理對象,因此被代理類的m1()方法就可以看作是對它的實現,被代理類添加 implements AbstractSubject表示對抽象主題的實現;

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;public interface AbstractSubject {void m1();
}

3. 代理類

代理被代理的類,對被代理類的邏輯(抽象主題進行了抽象)進行增強,

前提是代理類實現了抽象主題的抽象方法,同時持有被代理類的對象(可通過構造函數傳入)

注意這里的構造函數傳入的是Target實例,更通用的可以使用抽象主題角色AbstractSubject類型;

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;public class Proxy implements AbstractSubject {private Target target;public Proxy(Target target) {this.target = target;}@Overridepublic void m1() {before();target.m1();after();}private void before() {System.out.println("enhanced logic: before...");}private void after() {System.out.println("enhanced logic: after...");}
}

4. 測試類

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;public class DemoTest {public static void main(String[] args) {Target target = new Target();Proxy proxy = new Proxy(target);proxy.m1();}
}/* Output:
enhanced logic: before...
target implements. Core business logic
enhanced logic: after...
*///~

代理模式的種類

簡單了解一下:

  1. 遠程(Remote)代理:為一個位于不同的地址空間的對象提供一個局部代表對象。這個不同的地址空間可以是在本機器中,也可以在另一臺機器中。
  2. 虛擬(Virtual**)**代理:有時需要創建一些消耗較多資源的對象,可以首先創建代理對象,而將真實對象的創建延遲。例如,加載一個很大的圖片,可以通過圖片的代理來代替真正的圖片。
  3. 保護(Protect or Access)代理:控制對一個對象的訪問,如果需要,可以給不同的用戶提供不同級別的使用權限。
  4. 緩存(Cache)代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。
  5. 同步(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有沖突。
  6. 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,例如,記錄訪問的流量和次數等。

代理模式的優點

  1. 職責清晰真實的角色實現實際的業務邏輯,不用關心其他非本職的事務,通過后期的代理完成附加的事務,附帶的結果就是編程簡潔清晰。
  2. 高擴展性:具體主題角色隨需求不同可能有很多種,但只要實現了接口,代理類完全可以不做任何修改的情況下代理各種真實主題角色
  3. 智能化:代理類可以在運行時才確定需要去代理的真實主題,這是一種強大的功能。

示例解析:玩游戲打怪、升級示例

UML類圖

gamerproxy.png

  • 主題類和代理類同時實現接口
  • 主題類,就是被代理類,完成主要業務邏輯
  • 附加業務在代理類中完成
  • 客戶端調用:
    • 聲明接口的兩個示例分別指向主題類與代理類的實例對象;
    • 其中,在代理類示例創建時傳入主題類的實例(參數類型可以放大,參數定義為接口類型,當然主題類實現類此接口,屬于此接口類型,可以被傳入)。

1. 真實主題RealSubject:GamePlayer實現IGamePlayer接口中的方法

被代理類的具體實現,是最核心的業務邏輯,這里玩游戲最核心的就是打怪,升級;

package com.polaris.designpattern.list2.structural.pattern1.proxy;public class GamePlayer implements IGamePlayer {private String name = "";public GamePlayer(String name) {this.name = name;}@Overridepublic void killBoss() {System.out.println(this.name + "在打怪!");}@Overridepublic void upGrade() {System.out.println(this.name + "成功升了1級!");}
}

抽象主題Subject:IGamePlayer接口對游戲玩家進行抽象

抽象主題,抽象出打怪升級兩個核心業務邏輯,方便代理類進行實現,增強被代理類的邏輯

package com.polaris.designpattern.list2.structural.pattern1.proxy;public interface IGamePlayer {//殺怪void killBoss();//升級void upGrade();
}

代理主題ProxySubject:GamePlayerProxy是代理類

代理主題,在被代理類的核心業務邏輯實現(打怪、升級)的基礎上增加非核心業務邏輯:加日志、計時,

因此代理類是對被代理類的增強、強化

他持有被代理類的引用,通過構造函數初始化

package com.polaris.designpattern.list2.structural.pattern1.proxy;import java.util.Date;public class GamePlayerProxy implements IGamePlayer {private IGamePlayer player = null;public GamePlayerProxy(IGamePlayer player) {this.player = player;}//記錄打怪的時間private void log() {System.out.println("打怪時間 " + new Date().toString());}@Overridepublic void killBoss() {this.log();player.killBoss();}@Overridepublic void upGrade() {player.upGrade();this.countTime();}//計時private void countTime() {System.out.println("升1級耗時50小時");}}

測試類

package com.polaris.designpattern.list2.structural.pattern1.proxy;public class DemoTest {public static void main(String[] args) {IGamePlayer player = new GamePlayer("李逍遙");IGamePlayer proxy = new GamePlayerProxy(player);proxy.killBoss();proxy.upGrade();}
}/* Output:
打怪時間 Mon May 20 23:35:58 CST 2024
李逍遙在打怪!
李逍遙成功升了1級!
升1級耗時50小時
*///~

👈?上一篇:創建型設計模式對比 ? ?|?? 下一篇:裝飾器模式👉?

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

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

相關文章

UE5 OnlineSubsystem Steam創建會話失敗解決方法

連接上Steam但是創建會話失敗 解決方法 在DefaultEngine.ini中加上bInitServerOnClienttrue,這個其實在官方文檔里用注釋給出了,直接取消注釋就行 刪除項目目錄中的Saved、Internmediate、Binaries目錄 右鍵你的項目.uproject選擇Generate Visual Studio project f…

ASP.Net MVC在控制臺添加視圖時沒有模型類并且不能添加視圖

情況如下: 解決方法: 1.查看vs能否創建asp.net mvc項目,這種情況一般是更換了vs打開老項目 2.點擊跳轉至修改安裝選項界面 3.選擇安裝項即可 如果以上都有: 看看你的視圖文件是否存在在項目中 也不能點擊添加,如果…

探索數值分析的奧秘:掌握NumPy與Pandas基礎

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、NumPy:數值計算的效率提升器 二、Pandas:數據處理與分析的利器 …

Linux文本三劍客之sed

set的定義: sed是一種流編輯器,流編輯器會在編輯器處理數據之前基于預先提供的一組規則來編輯數據流。 sed編輯器可以根據命令來處理數據流中的數據,這些命令要么從命令行中輸入,要么存儲在一個命令文本文件中。 sed的執行過程&a…

Nextjs 動態路由獲取參數

目錄 一、創建page目錄下的路由文件 二、通過useRouter來獲取動態參數 先看官方文檔:Routing: Dynamic Routes | Next.js 使用Nextjs13版本參考官方文檔后實現仍有問題,網上的材料大多和官網一致,經過測試后,我找到了這個解決方…

【日記】今天好困(407 字)

正文 4T 硬盤降價了,好心動。雖然只降了 10 塊錢……. 為什么硬盤這么貴啊!哼。 柜面上雜事好多。雖然一天到晚見不到幾個客戶,但雜事就是很多。一個頭兩個大。也不知道從哪兒冒出來的這么多事。 芒果干到了!還沒去取,…

sql把一個表的某幾列的數據存到另一個表里

一.如何用slq語句把一個表中的某幾個字段的數據插入到另一個新表中,就要用下面這條slq語句: insert into 表名1(字段1,字段2) select 字段1,字段2 from 表名2 這里有一點值得注意的是這2個字段要一一對應,并且按順序。 二.如果另一個表是…

JAVASE之類和對象(1)

路雖遠,行則將至;事雖難,做則必成。 主頁:趨早——Step 專欄:JAVASE gitte:https://gitee.com/good-thg 引言: 這篇文章我們只介紹前半部分,下一篇文章會介紹剩下的部分。 目錄 一、…

LeetCode 面試150

最近準備面試,我以前不愿意面對的 現在保持一顆本心,就是專注于算法思想,語言基礎的磨煉; 不為速成,不急功近利的想要比賽,或者為了面試。 單純的本心,體驗算法帶來的快樂,是一件非常…

Python操作MySQL數據庫的工具--sqlalchemy

文章目錄 一、pymysql和sqlalchemy的區別二、sqlalchemy的詳細使用1.安裝庫2.核心思想3.整體思路4.sqlalchemy需要連接數據庫5.使用步驟1.手動提前創建數據庫2.使用代碼創建數據表3.用代碼操作數據表3.1 增加數據3.2 查詢數據3.3 刪除數據3.4 修改數據 一、pymysql和sqlalchemy…

2025秋招深度學習基礎面試題(一)

01. 卷積和BN如何融合提升推理速度 Conv和BN的融合:在網絡的推理階段,可以將BN層的運算融合到Conv層中,減少運算量,加速推理。本質上是修改了卷積核的參數,在不增加Conv層計算量的同時,略去了BN層的計算量。def fuse_conv_bn(conv, bn):std = (bn.running_var + bn.eps).…

數據倉庫、數據中臺、大數據平臺之間的關系

數據行業經常會出現數據倉庫、數據中臺、大數據平臺等概念,容易產生疑問,它們中間是相等,還是包含的關系? 數據中臺和數據倉庫概念的關系 數據中臺概念是包含數據倉庫的,數據倉庫是數據中臺中的一部分,包含…

探索Facebook:數字社交的新時代

Facebook,作為全球最大的社交網絡平臺之一,一直在引領著數字社交的發展潮流。隨著科技的不斷進步和社會的不斷變遷,Facebook也在不斷演進和創新,迎接著數字社交的新時代。本文將探索Facebook在數字社交領域的新發展,以…

Behind the Code:Polkadot 如何重塑 Web3 未來

2024 年 5 月 17 日 Polkadot 生態 Behind the Code 第二季第一集 《創造 Web3 的未來》正式上線。第一集深入探討了 Polkadot 和 Web3 技術在解決數字身份、數據所有權和去中心化治理方面的巨大潛力。 🔍 查看完整視頻: https://youtu.be/_gP-M5nUidc?…

抖音視頻怎么去水印保存部分源碼|短視頻爬蟲提取收集下載工具

抖音視頻怎么去水印保存部分源碼|短視頻爬蟲提取收集下載工具 抖音視頻去水印保存部分源碼: 通過使用Python中的requests、re和os等庫,可以編寫如下代碼來實現抖音視頻去水印保存的功能。 短視頻爬蟲提取手機下載工具的使用方法: 該工具主…

BevDet-4d(2): 環境安裝及效果展示

1. 環境安裝 conda create -n bevdet python=3.8 conda activate bevdet ? # 3 虛擬環境bevdet中安裝torch pip install spconv pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch

【數理統計02】延森Jensen‘s不等式的證明

延森不等式(Jensen’s Inequality)是凸函數理論中的一個重要結果,廣泛應用于概率論、統計學和優化理論等領域。這個不等式的基本形式是: 對于一個凸函數 f f f和一個隨機變量 X X X,如果 E [ X ] \mathbb{E}[X] E[X]存…

安科瑞為河南省促進分布式光伏發電健康持續發展提供解決方案

1 光伏、儲能運維市場分析 在光伏、儲能行業飛速發展的同時,已建的光伏、風力發電站和儲能系統的監控、運維管理項目的招標也非常多,2023年上半年,光伏電站開發企業運維招標規模28.6GW,同比增長204.3%,上述28.6GW招標…

Blender導出fbx模型,導入到ue5中模型丟失紋理材質

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、問題原因二、最終效果 前言 Blender導出fbx模型,導入到ue5中,發現模型丟失紋理材質,里面的原神人物模型妮露居然是白模,郁悶了大半天 一、問題原因 我在Blender導出fbx文件時…

【Python】全局變量與init的區別

一個腳本里,設置全局變量,和初始化類時__init__中加載,有什么區別? 在Python腳本中,使用全局變量和在類的__init__方法中加載數據有幾個關鍵區別: 作用域: 全局變量:全局變量在整個…