今天給你們分享的是java設計模式之代理模式中的靜態代理模式,動態代理模式將在後面文章中給出。若有不足,敬請指正。java
需求: DAO 層的代碼操做。咱們知道分別有數據庫
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); }
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; } }
注意:代理類與原始類都須要實現相同的接口編程
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; } }
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); } }
可使用動態代理模式。設計模式
所謂的動態代理模式,就是能夠自由的不指定的使用任何接口來實現代理。所謂的動態就不須要指定代理類的固定接口!!!ide
版權說明:歡迎以任何方式進行轉載,但請在轉載後註明出處!測試