設計模式——代理模式(Proxy)

設計模式

一、代理模式概述

代理模式是Java開發中使用較多的一種設計模式。代理設計就是爲其
他對象提供一種代理以控制對這個對象的訪問。


二、代碼實例

接口的應用:代理模式
【類似:想要租房子 & 中介;明星 & 經紀人】

1. 爲什麼非要代理類來做?

因爲代理類中不光做這個事,還做了些別的事,而被代理類只關注自己核心到底是要幹什麼就可以了
【如下代碼就能看到,真正的明星類只關注自己的核心功能"唱歌"就可以了,其他的都由代理類來完成】

2. 靜態代理

  • 這裏寫的是靜態代理(代理類是專門針對某一個接口的);
  • 後期講到框架會用到代理模式,但是是動態代理(代理類這次是代理租房子,下次是代理買菜…,究竟代理誰,是運行過程中動態分配的),需要用到反射的知識;
//測試
public class StaticProxyTest {
	public static void main(String[] args) {
		RealStar real = new RealStar();
		Proxy p = new Proxy(real);
		p.confer();
		p.signContract();
		p.bookTicket();
		p.sing();
		p.collectMoney();
	}
}

/**
 * 接口
 */
interface Star{
	void confer(); //面談
	
	void signContract(); //籤合同
	
	void bookTicket(); //訂票
	
	void sing(); //唱歌
	
	void collectMoney(); //收錢
}

/**
 * 真正的明星類【實際上只關注自己的核心功能:"唱歌";其他功能不關注】
 */
class RealStar implements Star{
	@Override
	public void confer() {}

	@Override
	public void signContract() {}

	@Override
	public void bookTicket() {}

	@Override
	public void sing() {
		System.out.println("明星,唱歌~~~");
	}

	@Override
	public void collectMoney() {}
}

/**
 * 代理類
 * 【除了明星的核心功能"唱歌",其他都由代理類來完成即可;】
 * 【需要"唱歌"的時候,調用真正的明星類來完成】
 */
class Proxy implements Star{
	private RealStar real;
	
	//創建代理類的時候,指明被代理的對象
	public Proxy(RealStar real){
		this.real = real;
	}

	@Override
	public void confer() {
		System.out.println("經紀人面談");
	}

	@Override
	public void signContract() {
		System.out.println("經紀人籤合同");
	}

	@Override
	public void bookTicket() {
		System.out.println("經紀人訂票");
	}

	@Override
	public void sing() {
		real.sing(); //唱歌則調用被代理類來完成
	}

	@Override
	public void collectMoney() {
		System.out.println("經紀人收錢");
	}
}

三、代理模式的應用場景

  • 安全代理:屏蔽對真實角色的直接訪問
  • 遠程代理:通過代理類處理遠程方法調用(RMI);
  • 延遲加載:先加載輕量級的代理對象,真正需要再加載真實對象;
    【比如你要開發一個大文檔查看軟件,大文檔中有大的圖片,有可能一個圖片有100MB,在打開文件時,不可能將所有的圖片都顯示出來,這樣就可以使用代理模式,當需要查看圖片時,用proxy來進行大圖片的打開。】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章