日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

【学习笔记】结合代码理解设计模式 —— 代理模式(静态代理、动态代理、延伸)

發布時間:2024/7/23 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】结合代码理解设计模式 —— 代理模式(静态代理、动态代理、延伸) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 什么是代理模式
      • 一. 代理模式簡介
      • 二. 靜態代理模式
      • 三. 動態代理模式
          • 萬能模版

前言:筆記基于狂神設計模式視頻、《大話設計模式》觀后而寫
(最近一直在更新之前的刷題博客,今天久違地更新一篇新博客啦~)

什么是代理模式

一. 代理模式簡介

代理模式是很常用的設計模式噢~同時也有很多的類型,適當學習一下是非常有必要的!

  • 定義:為其他對象提供一種代理,以控制對這個對象的訪問。
    可以理解為:在訪問對象時引入一定程度的間接性,由這種間接性來附加多種用途
  • UML 圖:代理組合真實角色,代理和真實對色都繼承公共接口
  • 舉個例子:經紀人(代理)、明星(真實角色),都繼承“接戲”接口。想找明星演戲的話,就得通過經紀人的“接戲”(把明星想象成經紀人的私有化對象)。這樣做的話,經紀人可以在自己的“接戲”方法上添加篩選、談薪等任務,而明星只需關注自己的業務即可。
  • 在上面這個例子里,代理模式的好處就有體現出來了。真實角色更加地專一,并且在代理角色的拓展,也遵守了OOP原則的開放封閉原則
  • 代理模式的分類
  • 靜態代理
  • 動態代理(這兩種類型,下文有結合代碼使用、講解)
  • 遠程代理:為一個對象在不同地址空間提供局部代表,用于隱藏一個對象存在于不同地址空間的事實(比如調用另一臺PC的方法)
  • 虛擬代理:用于存放實例化需要很長時間的真實對象,可以達到性能的最優化。比如打開嗶哩嗶哩,卡頓情況先顯示文字,而圖片、視頻流可能就只是一個白框之類的玩意,之后再逐漸加載出來,這里就用到了虛擬代理
  • 安全代理、智能指引等其他分類,感興趣可以去查查~

二. 靜態代理模式

  • 角色分類
  • 抽象角色:接口 or 抽象類。
  • 真實角色:就被代理的角色
  • 代理角色:真實角色的代理,一般會加一些附屬操作。
  • 客戶:訪問代理角色的人。
  • 好處:
  • 使真實角色的操作更加純粹,不用關注一些公共的業務。
  • 公共業務交給代理角色,實現了業務的分工
  • 公共業務發生拓展的時候,方便管理
  • 缺點:一個真實角色對應一個代理角色,代碼量增大,效率變低
  • 樣例代碼:房東、中介、客戶、租房(試著想想對應上面的什么角色吧~)
// ps:public class 不要介意,這里我是把不同文件的代碼直接拷過來了。 // 1. 公共接口 public interface Rent {public void rent(); }// 2. 房東(真實角色) public class Host implements Rent{@Overridepublic void rent() {System.out.println("房東:要出租房子");} }// 3. 中介(代理角色) public class MyProxy implements Rent {// 采用"組合"方式private Host host;MyProxy() {}MyProxy(Host host) {this.host = host;}@Overridepublic void rent() {// 可以添加一些更多的內容,而主體(被代理類)卻不用關心這些事情,只需要做好自己的事即可。// 滿足開放封閉原則System.out.println("中介:帶著看房");host.rent();System.out.println("中介:簽合同");} }// 4. 客戶:訪問代理角色 public class Client {public static void main(String[] args) {// 只需要找中介即可,不用管房東Host host = new Host();MyProxy MyProxy = new MyProxy(host);MyProxy.rent();} }

三. 動態代理模式

為了解決上面靜態代理模式的缺點,這里又有了動態代理模式~
(這一塊不太好理解,我寫得估計也不太詳細,建議再看一下視頻、或者其他博客)

  • 原理:動態代理基于反射機制實現。
  • 和靜態代理的區別
  • 靜態代理:實現接口,再通過接口實現類的實例來代理。
  • 動態代理:通過反射,造出一個接口類的實例
    (再原理一點,就是通過反射先造出一個帶構造方法的,接口的克隆體,再通過這個克隆體的構造方法,生成接口實例)
  • 使用到的類:
  • Proxy:提供用于創建動態代理類和實例的靜態方法,生成一個
  • InvocationHandler:每個代理實例都具有一個關聯的調用處理程序,調用代理實例的方法時,會被指派到其調用處理程序的 invoke 方法上。
  • com.sun.proxy.$Proxy0 :由 Proxy::newProxyInstance() 生成的代理類。實現了傳入接口的每一個方法,以及Object方法。并且統一調用了InvocationHandler 的 invoke() 方法。
  • 好處
  • 靜態代理的好處
  • 一個動態代理類代理的是一個接口,一般就是對應的一類業務。規避了靜態代理的缺點
  • 在原始類和接口未知時,就確定代理類的代理行為。靈活。
  • 樣例代碼:還是房東中介的例子噢
// 繼承 InvocationHandler 接口,此時 this 就是一個 InvocationHandler public class ProxyInvocationHandler implements InvocationHandler {// 被代理的接口private Rent rent;public void setRent(Rent rent) {this.rent = rent;}// 生成代理類public Object getMyProxy() {return Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);}// InvocationHandler 對應的方法 invoke,用于處理代理實例,并且返回結果。被 $Proxy0 的方法調用@Overridepublic Object invoke(Object Proxy, Method method, Object[] args) throws Throwable {// Method 也是反射包下的類,和反射相關。System.out.println("動態代理來了噢!");Object res = method.invoke(rent, args);return res;} }public class Client {public static void main(String[] args) {// 只需要找中介即可,不用管房東Host host = new Host();ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();// 放入被代理對象proxyInvocationHandler.setRent(host);Rent proxy = (Rent)proxyInvocationHandler.getMyProxy();// 這里的 rent,之后會執行 invoke(此時參數 Method 就是 rent)// “代理對象”執行“接口方法”,然后指派到對應的 InvocationHandler 的 invoke 上proxy.rent();} }
  • 整理:無注釋,一個文件不到30行,寫完整個動態代理例子
public interface Rent {void rent(); }public class RentDynamicProxy implements InvocationHandler {Rent rent;RentDynamicProxy(Rent rent) {this.rent = rent;}Object getProxy() {return Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("啟用動態代理");return method.invoke(rent, args);} }public class Host implements Rent{@Overridepublic void rent() {System.out.println("房東出租");}public static void main(String[] args) {Host host = new Host();RentDynamicProxy rentDynamicProxy = new RentDynamicProxy(host);Rent proxy = (Rent)rentDynamicProxy.getProxy();proxy.rent();} }
萬能模版
  • 任何接口都可以用噢
public class BetterProxyInvocationHandler implements InvocationHandler {// 1. 被代理的接口private Object target;// 設置被代理的接口public void setTarget(Object target) {this.target = target;}// 2. 生成得到代理類public Object getProxy() {return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("執行了 " + method.getName() + " 方法");Object res = method.invoke(target, args);return res;} }

總結

以上是生活随笔為你收集整理的【学习笔记】结合代码理解设计模式 —— 代理模式(静态代理、动态代理、延伸)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色小视频免费 | 99网站| 亚洲天堂网视频 | 国产精品视频不卡 | 国产美女视频 | www.色欧美| 中文字幕在线观看线人 | 亚洲亚裔videos黑人hd | 国产午夜无码视频在线观看 | 中文字幕无码精品亚洲资源网久久 | 五月婷婷七月丁香 | 搡老熟女老女人一区二区 | 日本在线中文字幕专区 | 国产精品精品国产色婷婷 | 一卡二卡在线视频 | 日本成人黄色片 | 超碰在线人人干 | 91一区| 娇妻第一次尝试交换的后果 | 亚洲综合无码一区二区 | 第一福利视频 | 在线一区二区三区视频 | 欧美精品一区二区免费 | 东京热av一区 | 女人16一毛片 | 色射色 | 国产1区二区 | 日韩影视一区 | 婷婷爱五月天 | 久久精品老司机 | jizz中国女人| 50部乳奶水在线播放 | 中文字幕欧美一区 | 夜夜嗨影院 | 强乱中文字幕 | 中国美女囗交视频 | 亲嘴扒胸摸屁股免费视频日本网站 | 性视频久久 | 久久激情久久 | 国产精品国产三级国产专区51区 | 精品乱子伦一区二区 | 欧美国产一区二区在线观看 | 手机在线小视频 | 8x8ⅹ国产精品一区二区二区 | 一卡二卡三卡视频 | 激情五月婷婷综合 | 99xav| 国产成人无码网站 | 久草久草久草 | 久久av不卡 | 超碰女人 | 精国产人伦一区二区三区 | 四虎精品一区二区三区 | av片免费播放 | 人人澡澡人人 | 欧美黄色免费观看 | 大尺度叫床戏做爰视频 | 韩国三级久久 | 人妻偷人精品一区二区三区 | 超污巨黄的小短文 | 成人无码一区二区三区 | 香蕉视频免费在线 | 男人av的天堂 | 三点尽露的大尺度国产 | 日韩一区二区三区视频 | 亚洲成人网络 | 欧美日韩一区二区三区在线视频 | 91蝌蚪91九色白浆 | 蘑菇av| 一级片久久久久 | 性插视频在线观看 | 久久国产精品精品国产色婷婷 | 三级视频在线看 | 精品无码一区二区三区蜜臀 | 天天摸天天操天天干 | 欧美极品在线观看 | 特级西西人体wwwww | h视频免费在线 | 不卡中文字幕在线 | 亚洲一级在线播放 | 亚洲av片不卡无码久久 | 99久久黄色 | 青青伊人影院 | 干成人网| 黄污视频网站 | 一区二区三区四区精品视频 | 亚洲欧美日韩色图 | 性欧美长视频 | 国产麻豆成人 | 日韩女优在线播放 | 亚洲图片欧美在线看 | 久草香蕉在线 | 成人你懂的 | 一区二区不卡在线观看 | 国产性猛交xx乱 | 亚洲一线视频 | 熟女高潮一区二区三区 | 国内外免费激情视频 | 国产黄免费|