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

  今天給你們分享的是java設計模式之代理模式中的靜態代理模式,動態代理模式將在後面文章中給出。若有不足,敬請指正。java


1、代理模式是什麼

  • 代理模式是面向對象編程的 23 種基礎設計模式之一。
  • 代理模式的定義: 爲其餘對象(源對象) 提供一種代理以控制對這個對象(源對象) 的訪問。

 需求: DAO 層的代碼操做。咱們知道分別有數據庫

  1. 得到數據庫鏈接(相同的)
  2. 得到操做對象(相同的)
  3. 封裝參數(每一個方法都不一樣的)
  4. 操做(每一個方法都不一樣的)
  5. 關閉(相同的)
  • 經過代理模式,將 DAO 的實現類,相同的代碼理解放在代理類裏面實現。 咱們 DAO 的實現類只要編寫封裝參數以及操做就能夠了。

2、代碼示例

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、說明

3.1 代理的模式的做用

  • 就是使用一個代理類來管理被代理類對象(源對象)的統一處理。咱們將這種統一處理的理解稱爲控制訪問。

3.2 代理模式的缺陷

  • 代理類必需要繼承或者實現一個基類或者接口!!(很笨重)。每一個接口都要實現一個新的代理 類。
  • 每一個方法的邏輯處理,仍是要重複編寫。

3.3 如何解決代理模式的缺陷

  可使用動態代理模式。設計模式

  • 一個代理類能夠代理多個對象 ,(不是代理模式一一對應)
  • 全部的方法的代碼均可以統一處理。

  所謂的動態代理模式,就是能夠自由的不指定的使用任何接口來實現代理。所謂的動態就不須要指定代理類的固定接口!!!ide


版權說明:歡迎以任何方式進行轉載,但請在轉載後註明出處!測試

相關文章
相關標籤/搜索