java設計模式學習筆記--代理模式
1. 什麼是代理模式
代理模式是物件的結構模式。代理模式給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用。
2.代理模式的結構
代理模式有兩種:靜態代理和動態代理。
先來看一下靜態代理:
2.1 靜態代理:
在代理模式中,有三個角色:
抽象物件角色:聲明瞭目標物件和代理物件的共同介面,這樣一來在任何可以使用目標物件的地方都可以使用代理物件。
目標物件角色:定義了代理物件所代表的目標物件。
代理物件角色:代理物件內部含有目標物件的引用,從而可以在任何時候操作目標物件;代理物件提供一個與目標物件相同的介面,以便可以在任何時候替代目標物件。代理物件通常在客戶端呼叫傳遞給目標物件之前或之後,執行某個操作,而不是單純地將呼叫傳遞給目標物件。
例子如下:
/**
* 抽象物件角色
*/
public abstract class AbstractObject {
public abstract void operation();
}
/**
* 目標物件角色
*/
public class RealObject extends AbstractObject{
@Override
public void operation() {
System.out.println("do something");
}
}
/**
* 代理物件角色
*/
public class ProxyObject extends AbstractObject{
private AbstractObject ao;
public ProxyObject(AbstractObject ao) {
this.ao = ao;
}
@Override
public void operation() {
System.out.println("before..........");
ao.operation();
System.out.println("after...........");
}
}
public class Client {
public static void main(String[] args){
AbstractObject ao = new RealObject();
ProxyObject po = new ProxyObject(ao);
po.operation();
}
}
執行結果如下:
before..........
do something
after...........
靜態代理很簡單,看一下就可以看懂。
靜態代理的特點:在程式執行之前。代理類就已經生成了。
缺點:
1、代理物件的一個介面只服務於一種型別的物件,如果要代理的方法很多,勢必要為每一種方法都進行代理,靜態代理在程式規模稍大時就無法勝任了。
2、如果介面增加一個方法,除了所有實現類需要實現這個方法外,所有代理類也需要實現此方法。增加了程式碼維護的複雜度。
所以,當出現需要代理很多類時,我們就可以使用動態代理。
2.2 動態代理
先來看程式碼:
首先還是定義一個動態代理介面:
public interface TestInterface {
void Sing();
}
寫一個實現類:
public class TestClass implements TestInterface{
@Override
public void Sing() {
System.out.println("sing a song");
}
}
建立動態代理類,這裡必須實現InvocationHandler介面,並實現介面中的invoke()方法。
public class DynamicProxy implements InvocationHandler{
private Object object;
public Object newInstance(Object object){
this.object = object;
//生成一個動態代理類
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before sing......... ");
Object ob = method.invoke(object,args);
System.out.println("after sing.......... ");
return ob;
}
}
public class Client {
public static void main(String[] args){
TestInterface ti = new TestClass();
DynamicProxy dp = new DynamicProxy();
TestInterface t = (TestInterface) dp.newInstance(ti);
t.Sing();
}
}
輸出:
before sing.........
sing a song
after sing..........
1、之所以成為動態代理,是因為只在執行時才將類創建出來,程式碼開始執行時,還沒有Proxy類,他是根據傳入的介面集建立的。
2、InvocationHandler是一個幫助proxy的介面,proxy會把呼叫轉發給他處理。proxy本身是利用Proxy.newProxyInstance()方法(該方法傳入的只能是介面陣列,裡面不能有類),在執行時動態建立的。
動態代理優點:
動態代理模式通過使用反射,可以在執行期決定載入哪個類,避免了一個類對應一個代理的問題。
相關推薦
java設計模式學習筆記--代理模式
1. 什麼是代理模式 代理模式是物件的結構模式。代理模式給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用。 2.代理模式的結構 代理模式有兩種:靜態代理和動態代理。 先來看一下靜態代理: 2.1 靜態代理: 在代理模式中,有三個角色:
設計模式學習筆記-代理模式
定義:代理模式,為其他物件提供一種代理以控制對這個物件的訪問,及通過代理物件訪問目標物件,這樣可以在不修改原目標物件的前提下,提供額外的功能操作 應用場景:1、比如在某物件執行方法後,記錄日誌; 代理模式可以分為靜態代理和動態代理。靜態代理就是在程式碼編譯時,硬編碼到程式中的代理類;動態代理就是在程式執行
java設計模式學習筆記--原型模式(淺克隆和深克隆)
1. 什麼是原型模式 原型模式屬於物件的建立模式。。原型模式允許你通過複製現有的例項來建立新的例項。 這個模式的重點在於,客戶端的程式碼在不知道要例項化何種特定類的情況下,可以製造出新的例項。在java中,一般使用clone()的方法,或者序列化。 2
java設計模式學習筆記--介面卡模式
1、什麼是介面卡模式 介面卡模式:將一個類的介面,轉換成客戶端 期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。 這個模式可以通過建立介面卡進行介面轉換,讓不相容的介面變成相容。可以讓客戶端從從實現的介面解耦,如果在一段時間後,想要改變介面,
設計模式學習筆記-原型模式
都是 tde 淺復制 posit osi 訪問 oid urn public 1. 概述 通過復制一個已經存在的實例來創建一個新的實例。被復制的實例被稱為原型,這個原型是可定制的。 2. 模式中的角色 2.1 抽象原型類(Abstract Prototype)
【大話設計模式讀書筆記——代理模式】
oid write 實現 == str href proxy logs i++ 代理模式 代理者是指一個類別可以作為其它東西的接口。代理者可以作任何東西的接口:網絡連接、內存中的大對象、文件或其它昂貴或無法復制的資源。 維基百科-代理模式 代理模式實現遠程圖片加載 /
大話設計模式學習筆記-策略模式
策略模式 它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化不會影響到使用演算法的客戶。 優點 策略模式是一種定義了一系列演算法的方法,從個概念上看,所有這些演算法完成的都是相同的工作。只是實現不同。他可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦
大話設計模式學習筆記-裝飾模式
裝飾模式 動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模式結構演示 元件類:Component Component是定義一個物件介面,可以給這些物件動態地新增職責。 abstract class Component{ public abst
設計模式學習之代理模式之靜態代理
設計模式學習之代理模式之靜態代理 前言 程式碼 執行結果 前言 最近發現設計模式都忘記的七七八八了,打算一邊寫一下部落格,一邊溫習一下設計模式,這裡因為最近寫了一下框架,模擬一下mybatis的代理方式 程式碼
設計模式學習(代理模式)
一.設計意圖: 為其他物件提供一種代理以控制對這個物件的訪問。 二.例子: 在公司中,客戶有需求都是向客服提,工程師則根據客服的反饋來修改產品。這時客服就是工程師們的代理。 1.首先建立統一介面 abstractimpl
設計模式學習--------12.代理模式學習
送禮物 遠程代理 查看 靜態 福爾摩斯 log cat eas and 場景: ? ? ?福爾摩斯一直想送禮物給花生,可是羞於直接贈送,於是想到讓房東太太去幫忙送禮物.編程怎樣實現呢
Java 設計模式學習筆記1——策略模式(Duck例子)
利用 實例化 top 而是 實現 學習筆記 left ng- 多個 0、假設現有工程(Duck)中遇到為類添加功能的問題,如何設計類添加新的功能? 1、利用繼承提供的Duck(鴨子)的行為會導致哪些缺點? (1)代碼在多個子類中重復 (2)很多男知道所有鴨子的全部行為
Java設計模式學習筆記,三:建造者模式
() stat sys pri builder 統一 return tengine str 建造者模式:實現了構建和裝配的解耦,即對象的各個子組件單獨構建,再進行裝配,從而建造完整對象。 該模式適用於構建較為復雜的對象(多個子組件)。 不同的構建者,使用相同的裝配者,可以建
java設計模式學習筆記(三) --- 行為型模式
文章目錄 責任鏈模式 策略模式 命令模式 直譯器模式 迭代器模式 中介者模式 備忘錄模式 觀察者模式 狀態模式 模板方法模式 訪問者模式 責任鏈模式 我獲取了一個物件,現在需要根據物件
java設計模式學習筆記(二)--- 結構型模式
文章目錄 介面卡模式 組合模式 裝飾模式 代理模式 什麼時候使用代理模式 享元模式 外觀模式(門面模式) 橋樑模式 介面卡模式 介面卡是一個介面轉換器,用於在接收不同的輸入時,得到一致
java設計模式學習筆記(一)--- 建立型模式
文章目錄 簡介 設計模式所遵循的幾個原則 一、工廠方法模式 簡單工廠模式 工廠方法模式 抽象工廠模式 工廠模式小結 單例模式 單例模式小結 建造者模式
JAVA設計模式學習筆記(一)
2018年11月03日 12:14:18 築夢^_^ 閱讀數:6 個人分類: JAVA
Java設計模式學習筆記(觀察者模式)
觀察者模式說起來很簡單,就是一個訂報紙的模式。但是實際上這部分我覺得還是很有意思的,《Head First設計模式》裡還有一些還沒看完,也是因為理解的不夠深吧。 觀察者模式會包含兩個元件:觀察者和主題。 這段程式碼是主題的介面: package
Java設計模式學習筆記(單例模式)
最近一直在看《Head First設計模式》,這本書寫的確實是很不錯的,專注於怎麼用最簡單的方式最通俗的語言讓人瞭解設計模式。據說GoF的設計模式那本書寫的很好,是一本經典,但是就是難懂,這本書應該就是我們這些一看經典書就困的人的寶貝了。 不過Head First系列並不專注於
java/android 設計模式學習筆記(10)---建造者模式
這篇部落格我們來介紹一下建造者模式(Builder Pattern),建造者模式又被稱為生成器模式,是創造性模式之一,與工廠方法模式和抽象工廠模式不同,後兩者的目的是為了實現多型性,而 Builder 模式的目的則是為了將物件的構建與展示分離。Builder