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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

《研磨设计模式》chap11 代理proxy模式

發布時間:2025/3/21 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《研磨设计模式》chap11 代理proxy模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景:需要查詢所有用戶數據,不能翻頁都顯示出來,只顯示姓名,在需要的情況下,點擊某個用戶的姓名出現詳細信息。

1. 正常編碼:僅查詢當前數據

public static void main(String[] args) throws Exception{UserManager userManager = new UserManager();Collection<UserModel> col = userManager.getUserByDepId("0101");System.out.println(col);}public class UserManager { /*** 根據部門編號來獲取該部門下的所有人員* @param depId 部門編號* @return 該部門下的所有人員*/public Collection<UserModel> getUserByDepId(String depId)throws Exception{Collection<UserModel> col = new ArrayList<UserModel>();Connection conn = null;try{conn = this.getConnection();String sql = "select * from tbl_user u,tbl_dep d "+"where u.depId=d.depId and d.depId like ?";PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, depId+"%");ResultSet rs = pstmt.executeQuery();while(rs.next()){UserModel um = new UserModel();um.setUserId(rs.getString("userId"));um.setName(rs.getString("name"));um.setDepId(rs.getString("depId"));um.setSex(rs.getString("sex"));col.add(um);}rs.close();pstmt.close();}}

2. 代理模式簡介

public interface Subject {/*** 示意方法:一個抽象的請求方法*/public void request(); }public class RealSubject implements Subject{ public void request() {//執行具體的功能處理} }public class Proxy implements Subject{/*** 持有被代理的具體的目標對象*/private RealSubject realSubject=null;/*** 構造方法,傳入被代理的具體的目標對象* @param realSubject 被代理的具體的目標對象*/public Proxy(RealSubject realSubject){this.realSubject = realSubject;} public void request() {//在轉調具體的目標對象前,可以執行一些功能處理 //轉調具體的目標對象的方法realSubject.request(); } }

3. 用代理模式解決使用場景

public interface UserModelApi {public String getUserId();public void setUserId(String userId);public String getName();public void setName(String name);public String getDepId();public void setDepId(String depId);public String getSex();public void setSex(String sex); }public class UserModel implements UserModelApi{ private String userId; //用戶編號 private String name; //用戶姓名 private String depId;//部門編號... }public class Proxy implements UserModelApi{ private UserModel realSubject=null;//持有被代理的具體的目標對象 public Proxy(UserModel realSubject){//傳入被代理的具體的目標對象this.realSubject = realSubject;} private boolean loaded = false;//標示是否已經重新裝載過數據了public String getDepId() { if(!this.loaded){ //需要判斷是否已經裝載過了reload(); this.loaded = true;}return realSubject.getDepId();} //重新查詢數據庫以獲取完整的用戶數據private void reload(){try{conn = this.getConnection();String sql = "select * from tbl_user where userId=? ";//查詢所有PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, realSubject.getUserId()); ResultSet rs = pstmt.executeQuery();if(rs.next()){//只需要重新獲取除了userId和name外的數據realSubject.setDepId(rs.getString("depId"));realSubject.setSex(rs.getString("sex"));} ...}public class UserManager { public Collection<UserModelApi> getUserByDepId(String depId)throws Exception{Collection<UserModelApi> col = new ArrayList<UserModelApi>();Connection conn = null;try{conn = this.getConnection();//只需要查詢userId和name兩個值就可以了String sql = "select u.userId,u.name "+"from tbl_user u,tbl_dep d "+"where u.depId=d.depId and d.depId like ?";PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, depId+"%");ResultSet rs = pstmt.executeQuery();while(rs.next()){//這里是創建的代理對象,而不是直接創建UserModel的對象Proxy proxy = new Proxy(new UserModel());//只是設置userId和name兩個值就可以了proxy.setUserId(rs.getString("userId"));proxy.setName(rs.getString("name"));col.add(proxy);}rs.close();pstmt.close(); } }

4. 總結:

代理模式在客戶和被客戶訪問的對象之間,引入了一定程度的間接性,客戶是直接使用代理,讓代理來與被訪問的對象進行交互。不同的代理類型,這種附加的間接性有不同的用途,也就具有不同的特點。

  • 遠程代理
    隱藏了一個對象存在于不同的地址空間的事實,也即是客戶通過遠程代理去訪問一個對象,根本就不關心這個對象在哪里,也不關心如何通過網絡去訪問到這個對象。從客戶的角度來講,它只是在使用代理對象而已。
  • 虛代理
    可以根據需要來創建“大”對象,只有到必須創建對象的時候,虛代理才會創建對象,從而大大加快程序運行速度,并節省資源。通過虛代理可以對系統進行優化。
  • 保護代理
    可以在訪問一個對象的前后,執行很多附加的操作,除了進行權限控制之外,還可以進行很多跟業務相關的處理,而不需要修改被代理的對象。也就是說,可以通過代理來給目標對象增加功能。
  • 智能指引
    和保護代理類似,也是允許在訪問一個對象的前后,執行很多附加的操作,這樣一來就可以做很多額外的事情,比如,引用計數等。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的《研磨设计模式》chap11 代理proxy模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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