1. 程式人生 > >【每日一記】設計模式——代理模式

【每日一記】設計模式——代理模式

概述

  • 定義:為其他物件提供一種代理以控制對這個物件的訪問
  • 適用場景:
    1. 遠端代理:為一個物件在不同的地址空間提供區域性代表。這樣可以隱藏一個物件存在於不同地址空間的事實
    2. 虛擬代理:根據需要建立開銷很大的物件。通過它來存放例項化需要很長時間的真實物件
    3. 安全代理:用來控制真實物件訪問時的許可權
    4. 智慧代理:是指當呼叫真實的物件時,代理處理另外一些事

實現

靜態代理

public interface ISubject {
    void work();
}
// 被代理的類
public class ConcreteSubject implements ISubject {

    @Override
public void work() { System.out.println("working"); } } // 代理 public class Proxy implements ISubject { private ISubject subject; public Proxy() { this.subject = new ConcreteSubject(); } @Override public void work() { // 擴充套件原始work()方法,新增輸出執行耗時功能 long
start = System.currentTimeMillis(); subject.work(); long end = System.currentTimeMillis(); System.out.println("duration: " + (end - start)); } }
// 客戶端
public class Client {
    public static void main(String[] args) throws Exception {
        ISubject sub = new Proxy();
        sub.work();
    }
}

動態代理

當要對多個類使用代理模式時,使用靜態代理會產生大量的代理類,為了解決這個問題,動態代理出現了

jdk中要實現動態代理,需要實現InvocationHandler介面

public class DynamicProxy implements InvocationHandler {
    private ISubject real;

    public DynamicProxy() {
        this.real = new ConcreteSubject();
    }

    // 當呼叫被註冊代理介面中的方法時,該方法會自動被呼叫
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long start = System.currentTimeMillis();
        Object ret = method.invoke(real, args);
        long end = System.currentTimeMillis();
        System.out.println("duration: " + (end - start));
        return ret;
    }

}
// 客戶端
public class Client {
    public static void main(String[] args) throws Exception {
        ClassLoader loader = Client.class.getClassLoader();
        ISubject proxy = (ISubject) Proxy.newProxyInstance(loader, new Class<?>[] { ISubject.class }, new DynamicProxy());
        proxy.work();
    }
}

與裝飾器模式的區別

無論從功能還是從實現上看,裝飾器模式和代理模式都十分相似,總給人一種這兩貨一模一樣的感覺,但仔細思考後會發現兩者確實不同

  • 裝飾器模式更加關注於功能的擴充套件
  • 代理模式更關注與物件的控制

換言之,代理模式可以對客戶端隱藏一個物件的資訊,而裝飾器模式一般不用這麼幹

再直白點就是裝飾器模式中裝飾器的構造方法一般會傳入一個引數當作被裝飾物件,但是代理模式中被代理類一般是在代理類中建立的而非引數傳遞

// 裝飾器模式
public class Decorator implements ISubject {
    private ISubject subject;

    public Decorator(ISubject subject) {
        this.subject = subject;
    }

    ...
}

// 代理模式
public class Proxy implements ISubject {
    private ISubject subject;

    public Proxy() {
        this.subject = new ConcreteSubject();
    }

    ...
}

相關推薦

每日設計模式——代理模式

概述 定義:為其他物件提供一種代理以控制對這個物件的訪問 適用場景: 遠端代理:為一個物件在不同的地址空間提供區域性代表。這樣可以隱藏一個物件存在於不同地址空間的事實 虛擬代理:根據需要建立開銷很大的物件。通過它來存放例項化需要很長時間的真實物件 安全代理

每日設計模式——橋接模式

概述 意圖:將抽象部分與它的實現部分分離,使它們都可以獨立地變化 適用場景:某個類具有兩個或兩個以上的維度變化,如果只是用繼承將無法實現這種需要,則可以使用橋接模式 實現 以一個人做運動的例子進行說明,其中人和運動為可變唯獨:人可分為男人、女人,運

每日設計模式——中介者模式

概述 定義:定義一箇中介物件來封裝系列物件之間的互動。 適用場景: 一組定義良好的物件,現在要進行復雜的通訊 定製一個分佈在多個類中的行為,而又不想生成太多的子類 實現 // 同事類 p

每日設計模式——開篇

寫在最前 未曾清貧難成人,不經打擊老天真。 自古英雄出煉獄,從來富貴入凡塵。 醉生夢死誰成氣,拓馬長槍定乾坤。 揮軍千里山河在,立名揚威傳後人。 沒有夢想和鹹魚有什麼區別,沒有技術光有夢想又有何用,所以從今天起開個系列記錄自己

(轉載)[海莉zhe] 每日Unity3D 實戰練習-實現物體的映象 (十四)

http://www.manew.com/thread-140831-1-1.html     最近在學習如何實現物體的映象,練習了一個簡單的例子,然後和大家一起探討一下哈!物體映象的操作實際上是通過一個模型的MeshFilter 和 MeshRenderer 來獲取

每日

意義 什麽 就是 自己 有意 地方 別人 現實 有時 每日一悟 【做“該”做的,不做“不該”做的】 有時候你覺得盡心盡力,別人根本不懂; 有時候你覺得付出很多,但 是在對其他部門付出,自己部門的人看不見,一樣沒有意義。 所以現實就是,不要在別人看不到的地方做事。 如果看不到

每日數據倉庫之全量表、增量表、拉鏈表、流水表

水表 打開 tails 開始 當我 net 最大的 閱讀 增量 每日一悟 數據倉庫之全量表、增量表、拉鏈表、流水表 背景 從使用MySQL階段,到前陣子跳槽到新公司開始使用hive,面對的表變多,數據量也完全超過之前。基本是隨便核查個問題都已經不是Excel能承擔得起的了

每日wehome增長數字

思維 大會 新產品 受限 方法 深圳 產品 需要 是不是 每日一悟 airbnb增長數字 這周在做新產品的數據體系規劃,越寫下去越覺著思維受限。找到了一點框架的感覺,但總是覺著不夠,畢竟事務總是在變化的,而我不知道我所掌握的是不是夠先進。另一方面,對於特殊關鍵點也在費勁心

每日python-logistics回歸

gis 目的 碎片 python 想想你 自己的 是不是 logistic 小時 每日一悟 【每天都想想你的目標是什麽】 工作時,雖然沒什麽成就,但總是感覺忙得得不了閑。 像這種單雙休每天早十晚八點半的日子,再加上通勤倆個多小時,待在家的時間就只剩下早八點半前,晚上十點後。

每日裝飾器

count 其他 用戶登陸 glob 每日一練 div class 密碼 try 寫一個用戶登錄認證函數,要求: 1.要求用戶輸入賬號密碼和txt中的用戶名數據庫對比; 2.要求用戶有三次嘗試機會; 3.要求用戶登陸後,執行其他功能無需再驗證; txt數據: {‘auth_

每日獎金問題

一:問題描述 二:問題分析     涉及資料:利潤profit,獎金bonus     資料間的關係:當profit<=10w,bonus = pro

每日

題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 程式碼: num = 0 for i in range(1,5): for a in range(1,5): for b in range(1,5):

每日百元買百雞問題

問題描述: 雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞,問雞翁、母、雛各幾何? Python版 for i in range(0,20): #公雞最多買20只 for x in range(0,33):

每日Java 基本資料型別基礎面試題

原文作者資訊 作者:工匠若水 公眾號: 碼農每日一題 (1)問:如下程式語句有什麼問題嗎? short s1 = 1;s1 = s1 + 1;    //1short s2 = 1;s2 +

每日P魔術橡皮擦摳圖工具的使用

Ps一鍵摳圖。主要用到魔術橡皮擦工具和圖層混合模式引數設定。 素材如下: 效果圖如下: 第一步:Ctrl+O開啟飛機素材,回到工具欄,開啟魔術橡皮擦工具,點選飛機背景圖層,摳圖效果就出來了,效果如下: 第二步:我們可以看到背景層還沒有完全

每日查詢一個字串中第一個只出現兩次的字元

題目:查詢一個字串中第一個只出現兩次的字元。比如:“abcdefabcdefabc”中第一個只出現兩次為‘d’,要求時間複雜度為O(N),空間複雜度為O(1) 解決方法:可以使用雜湊表統計每個字元出現的次數。因為字元只有256種可能,所以我們可以申請一個25

2014年12月4日每日SOAP、WSDL、UDDI這三者有什麼區別和聯絡?

【答】 Web Service平臺有三種元素構成:SOAP、WSDL、UDDI。 一個消費者可以在UDDI登錄檔查詢服務,取得服務的WSDL描述,然後通過SOAP來呼叫服務。 SOAP、WSDL、UDDI的區別如下: 1. SOAP(Simple Object Access Protocol,簡單物件訪問協議

每日基本資料型別與包裝型別的面試題

基礎知識:1、java中的基本資料型別  java是一個近乎純潔的面向物件程式設計語音,引入基本資料型別是為了程式設計方便,但是為了能夠將這些基本資料型別當成物件操作,java為每一個基本資料型別引入了對應的包裝型別(wrapper class)。具體如下:  int  --

讀書筆記大話設計模式代理模式

代理模式(使用頻率:4顆星):       代理模式(Proxy):為其他物件提供一個代理以控制對這個物件的訪問。 代理模式:給某一個物件提供一個代理或佔位符,並由代理物件來控制對原物件的訪問

Big Data 每日Spark開發效能調優總結

1. 分配資源調優 Spark效能調優的王道就是分配資源,即增加和分配更多的資源對效能速度的提升是顯而易見的,基本上,在一定範圍之內,增加資源與效能的提升是成正比的,當公司資源有限,能分配的資源達到頂峰之後,那麼才去考慮做其他的調優 如何分配及分配哪些資源 在生產環境中,提交spark作