設計模式(一)—— 代理模式
一、設計模式的概念
1.1設計模式(Design pattern)
是一套被反覆使用、多數人知曉、經過分類編目的程式碼設計經驗的總結。
使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼的可擴充套件性和可維護性。
通用設計模式有23種。
1.2 設計模式的本質
面向物件設計原則
要真正理解設計模式就需要透徹理解面向物件設計原則和麵向物件的三大特性(封裝、繼承、多型)
面向物件程式設計技術
設計模式的本質是面向物件程式設計技術 的熟練和靈活運用。
二、代理設計模式
代理模式分為靜態代理和動態代理
靜態代理
在程式執行前由開發人員提前為目標類建立代理類
動態代理
在程式執行時運用反射機制動態的為目標類建立代理類(Spring AOP採用動態代理)
2.1 解決的問題
代理模式是為目標物件建立代理物件以提供一種代理機制,讓代理物件能控制目標物件的訪問,並且可以在不改變目標物件的情況下為目標物件新增額外的功能。
2.2 實現方式
建立一個介面,讓目標物件和代理物件實現該介面。在代理類中引用目標類的物件,並且代理類可為目標物件新增功能
/*
* <一句話功能簡述>
* <代理介面>
* @Author Administrator on 2020/10/21 0021 上午 11:25
* @Param
* @return
* */
public interface ISellerProxy
{
public int sell();
}
/**
* @author :
* @date :Created in 2020/10/21 0021 上午 11:26
* @description:商品廠家目標類
* @modified By:
* @version: $
*/
public class GoodsTarget implements ISellerProxy
{
@Override
public int sell()
{
return 200;
}
}
/**
* @author :
* @date :Created in 2020/10/21 0021 上午 11:28
* @description:商品代理類
* @modified By:
* @version: $
*/
public class GooodsProxy implements ISellerProxy
{
private GoodsTarget target;//目標物件
public GooodsProxy(){
this.target = new GoodsTarget();
}
@Override
public int sell()
{
int price = target.sell();
price += 10;
return price;
}
}
建立客戶類,獲得代理類物件
/** * @author :yzl * @date :Created in 2020/10/21 0021 上午 11:32 * @description:客戶類 * @modified By: * @version: $ */ public class Customer { public static void main(String[] args) { GooodsProxy gooodsProxy = new GooodsProxy(); int price = gooodsProxy.sell(); System.out.println("購買商品:"+gooodsProxy); } }
2.3 代理模式的優缺點
優點
1.代理模式在客戶端物件和目標物件之間起到的一箇中介作用和保護目標物件的作用
2.代理物件可以擴充套件目標物件的功能
3.代理模式能將客戶物件與目標物件分離,在一定的程度上降低了系統的耦合度,增加了程式的可擴充套件性。
缺點
1.代理模式會造成系統設計中類的數量增加
2.在客戶物件和目標物件之間增加了一個代理物件,會造成請求處理的速度變慢。
3.在一定程度上增加了系統的複雜度。
2.4 代理模式的使用場景
1.遠端代理 為一個位於不同網路計算機的物件提供一個本地的代理(如本地網盤)
2.虛擬代理 如果需要建立一個消耗比較大的物件,先建立一個消耗較小的物件來表示,真實物件只在需要的時候才被真實建立(如圖片顯示)
3.安全代理 用來控制不同種類客戶對真實物件的訪問權
4.智慧指引 注意用於呼叫模板物件時,代理附加一些額外的處理功能(GC垃圾回收)
5.延遲載入 為了提高系統的效能,延遲對目標物件的載入(如MyBatis的延時載入)