??今天給大家分享的是java設(shè)計(jì)模式之代理模式中的靜態(tài)代理模式虹钮,動(dòng)態(tài)代理模式將在后面文章中給出趴酣。如有不足徒探,敬請(qǐng)指正威兜。
一销斟、代理模式是什么
代理模式是面向?qū)ο缶幊痰?23 種基礎(chǔ)設(shè)計(jì)模式之一。
代理模式的定義: 為其他對(duì)象(源對(duì)象) 提供一種代理以控制對(duì)這個(gè)對(duì)象(源對(duì)象) 的訪問牡属。
?需求: DAO 層的代碼操作票堵。我們知道分別有
獲得數(shù)據(jù)庫(kù)連接(相同的)
獲得操作對(duì)象(相同的)
封裝參數(shù)(每個(gè)方法都不同的)
操作(每個(gè)方法都不同的)
關(guān)閉(相同的)
通過代理模式扼睬,將 DAO 的實(shí)現(xiàn)類逮栅,相同的代碼理解放在代理類里面實(shí)現(xiàn)。 我們 DAO 的實(shí)現(xiàn)類只要編寫封裝參數(shù)以及操作就可以了窗宇。
二措伐、代碼示例
2.1 創(chuàng)建一個(gè)原始類接口
package com.xkt.dao; /** * @author lzx * * @param <T> */ public interface DAO<T> { /** * 增加記錄 * * @param entity * @return */ int insert(T entity); /** * 刪除記錄 * * @param id * @return */ int deleteById(Integer id); /** * 查詢記錄 * * @param id * @return */ T findById(Integer id); /** * 記錄 * * @param entity * @return */ int update(T entity); }
2.2 創(chuàng)建一個(gè)原始類
package com.xkt.dao; import com.xkt.pojo.Student; /** * @author lzx * */ public class StudentDAO implements DAO<Student> { @Override public int insert(Student entity) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝插入數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-插入數(shù)據(jù)-" + entity.getStudentName()); return 1; } @Override public int deleteById(Integer id) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝刪除數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-插入數(shù)據(jù)-"); return 1; } @Override public Student findById(Integer id) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝查詢數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-查詢數(shù)據(jù)-"); return null; } @Override public int update(Student entity) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝更新數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-更新數(shù)據(jù)-"); return 1; } }
2.3 創(chuàng)建一個(gè)代理類
注意:代理類與原始類都需要實(shí)現(xiàn)相同的接口
package com.xkt.proxy; import com.xkt.dao.DAO; import com.xkt.pojo.Student; public class ProxyDAO implements DAO<Student> { private DAO<Student> source; public ProxyDAO(DAO<Student> source) { this.source = source; } @Override public int insert(Student entity) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); int count = source.insert(entity); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return count; } @Override public int deleteById(Integer id) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); int count = source.deleteById(id); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return count; } @Override public Student findById(Integer id) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); Student student = source.findById(id); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return student; } @Override public int update(Student entity) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); int count = source.update(entity); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return count; } }
2.4 測(cè)試代碼
package com.xkt.test; import org.junit.Test; import com.xkt.dao.StudentDAO; import com.xkt.pojo.Student; import com.xkt.proxy.ProxyDAO; public class StudentDAOTest { @Test public void insert() { StudentDAO studentDAO = new StudentDAO(); ProxyDAO proxyDAO = new ProxyDAO(studentDAO); Student entity = new Student(); entity.setStudentName("張三"); proxyDAO.insert(entity); } }
三、說(shuō)明
3.1 代理的模式的作用
就是使用一個(gè)代理類來(lái)管理被代理類對(duì)象(源對(duì)象)的統(tǒng)一處理军俊。我們將這種統(tǒng)一處理的理解稱為控制訪問侥加。
3.2 代理模式的缺陷
代理類必須要繼承或者實(shí)現(xiàn)一個(gè)基類或者接口!7喙(很笨重)担败。每個(gè)接口都要實(shí)現(xiàn)一個(gè)新的代理 類。
每個(gè)方法的邏輯處理镰官,還是要重復(fù)編寫提前。
3.3 如何解決代理模式的缺陷
可以使用動(dòng)態(tài)代理模式。
一個(gè)代理類可以代理多個(gè)對(duì)象 泳唠,(不是代理模式一一對(duì)應(yīng))
所有的方法的代碼都可以統(tǒng)一處理狈网。
所謂的動(dòng)態(tài)代理模式,就是可以自由的不指定的使用任何接口來(lái)實(shí)現(xiàn)代理。所謂的動(dòng)態(tài)就不需要指定代理類的固定接口M夭浮S露狻!
加java高級(jí)架構(gòu)師群獲取Java工程化士鸥、高性能及分布式闲孤、高性能、深入淺出础淤。高架構(gòu)崭放。性能調(diào)優(yōu)、Spring鸽凶,MyBatis币砂,Netty源碼分析和大數(shù)據(jù)等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨的直播免費(fèi)學(xué)習(xí)權(quán)限都是大牛帶飛?讓你少走很多的彎路的?群號(hào)是:?798891710對(duì)了?小白勿進(jìn)?最好是有開發(fā)經(jīng)驗(yàn)