今天給大家分享的是java設計模式之代理模式中的靜态代理模式,動态代理模式将在後面文章中給出。如有不足,敬請指正。
一、代理模式是什麼
代理模式是面向對象程式設計的 23 種基礎設計模式之一。
代理模式的定義: 為其他對象(源對象) 提供一種代理以控制對這個對象(源對象) 的通路。
需求: DAO 層的代碼操作。我們知道分别有
獲得資料庫連接配接(相同的)
獲得操作對象(相同的)
封裝參數(每個方法都不同的)
操作(每個方法都不同的)
關閉(相同的)
通過代理模式,将 DAO 的實作類,相同的代碼了解放在代理類裡面實作。 我們 DAO 的實作類隻要編寫封裝參數以及操作就可以了。
二、代碼示例
2.1 建立一個原始類接口
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 建立一個原始類
package com.xkt.dao;
import com.xkt.pojo.Student;
/**
* @author lzx
*
*/
public class StudentDAO implements DAO<Student> {
@Override
public int insert(Student entity) {
// 3.封裝參數(每個方法都不同的)
System.out.println("-封裝插入資料-");
// 4.操作(每個方法都不同的)
System.out.println("-操作-插入資料-" + entity.getStudentName());
return 1;
}
@Override
public int deleteById(Integer id) {
// 3.封裝參數(每個方法都不同的)
System.out.println("-封裝删除資料-");
// 4.操作(每個方法都不同的)
System.out.println("-操作-插入資料-");
return 1;
}
@Override
public Student findById(Integer id) {
// 3.封裝參數(每個方法都不同的)
System.out.println("-封裝查詢資料-");
// 4.操作(每個方法都不同的)
System.out.println("-操作-查詢資料-");
return null;
}
@Override
public int update(Student entity) {
// 3.封裝參數(每個方法都不同的)
System.out.println("-封裝更新資料-");
// 4.操作(每個方法都不同的)
System.out.println("-操作-更新資料-");
return 1;
}
}
2.3 建立一個代理類
注意:代理類與原始類都需要實作相同的接口
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.獲得資料庫連接配接(相同的)
System.out.println("-獲得資料庫連接配接-");
// 2.獲得操作對象(相同的)
System.out.println("-獲得操作對象-");
int count = source.insert(entity);
// .關閉(相同的)
System.out.println("-關閉-");
return count;
}
@Override
public int deleteById(Integer id) {
// 1.獲得資料庫連接配接(相同的)
System.out.println("-獲得資料庫連接配接-");
// 2.獲得操作對象(相同的)
System.out.println("-獲得操作對象-");
int count = source.deleteById(id);
// .關閉(相同的)
System.out.println("-關閉-");
return count;
}
@Override
public Student findById(Integer id) {
// 1.獲得資料庫連接配接(相同的)
System.out.println("-獲得資料庫連接配接-");
// 2.獲得操作對象(相同的)
System.out.println("-獲得操作對象-");
Student student = source.findById(id);
// .關閉(相同的)
System.out.println("-關閉-");
return student;
}
@Override
public int update(Student entity) {
// 1.獲得資料庫連接配接(相同的)
System.out.println("-獲得資料庫連接配接-");
// 2.獲得操作對象(相同的)
System.out.println("-獲得操作對象-");
int count = source.update(entity);
// .關閉(相同的)
System.out.println("-關閉-");
return count;
}
}
2.4 測試代碼
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);
}
}
三、說明
3.1 代理的模式的作用
就是使用一個代理類來管理被代理類對象(源對象)的統一處理。我們将這種統一處理的了解稱為控制通路。
3.2 代理模式的缺陷
代理類必須要繼承或者實作一個基類或者接口!!(很笨重)。每個接口都要實作一個新的代理 類。
每個方法的邏輯處理,還是要重複編寫。
3.3 如何解決代理模式的缺陷
可以使用動态代理模式。
一個代理類可以代理多個對象 ,(不是代理模式一一對應)
所有的方法的代碼都可以統一處理。
所謂的動态代理模式,就是可以自由的不指定的使用任何接口來實作代理。所謂的動态就不需要指定代理類的固定接口!!!
加java進階架構師群擷取Java工程化、高性能及分布式、高性能、深入淺出。高架構。
性能調優、Spring,MyBatis,Netty源碼分析和大資料等多個知識點進階進階幹貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群号是: 798891710對了 小白勿進 最好是有開發經驗