天天看點

java設計模式之代理模式(靜态代理)

java設計模式之代理模式(靜态代理)

 今天給大家分享的是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對了 小白勿進 最好是有開發經驗