1. 程式人生 > >設計模式之代理模式(動態代理)

設計模式之代理模式(動態代理)

概要

設計模式是一門藝術,如果真正瞭解這門藝術,你會發現,世界都將變得更加優美。

簡介

在上一篇已經大概講解了代理模式,相信大家對代理模式有一定的瞭解了,如果沒有

相信大家肯定有收穫,如果有了一定的基礎,那麼在去看,相信理解會更加快,而且非常容易明白。

程式碼演示

因為上一篇已經比較詳細的分析過了,所以直接上程式碼了

(1)定義代理介面

package com.zengtao.demo.proxy;

public interface IProxy {

    void buyTicket();

}

(2)動態代理

package com.zengtao.demo.proxy;

import
java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 動態代理 */ public class DynamicProxy implements InvocationHandler { private Object obj; public DynamicProxy(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable { return method.invoke(obj, args); } }

(3)具體代理買票

package com.zengtao.demo.proxy;

import com.zengtao.demo.bean.User;

/**
 * 具體代理買票
 */
public class RealProxy implements IProxy {

    private User user;

    public RealProxy() {

    }

    public RealProxy(User user) {
        this
.user = user; } public void setUser(User user) { this.user = user; } @Override public void buyTicket() { // 具體實現邏輯 if (user != null) { System.out.println("***********我要買票***********"); System.out.println("資訊如下:"); System.out.println("姓名:" + user.getName()); System.out.println("性別:" + user.getSex()); System.out.println("身份證號:" + user.getCardCode()); System.out.println("住址:" + user.getHomeAddress()); System.out.println("***********資訊已核對***********"); System.out.println("出票成功:動車D2222次09車20A"); } } }

(4)bean

package com.zengtao.demo.bean;

import java.io.Serializable;

@SuppressWarnings("serial")
public class User implements Serializable {

    private String cardCode;
    private String name;
    private String homeAddress;
    private String sex;

    public String getCardCode() {
        return cardCode;
    }

    public void setCardCode(String cardCode) {
        this.cardCode = cardCode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

(5)具體呼叫

package com.zengtao.demo;

import com.zengtao.demo.bean.User;
import com.zengtao.demo.proxy.Proxy;
import com.zengtao.demo.proxy.RealProxy;

public class Main {

    public static void main(String[] str) {
       // 使用者資訊
        User user = new User();
        user.setCardCode("510522177709096836");
        user.setSex("男");
        user.setName("無名氏");
        user.setHomeAddress("地球村第七號店鋪");

        // 建立買票者
        IProxy zhangsan = new RealProxy(user);

        // 建立動態代理
        DynamicProxy proxy = new DynamicProxy(zhangsan);

        // 獲取被代理的classloader
        ClassLoader loader = zhangsan.getClass().getClassLoader();

        // 動態構建一個代理站點
        IProxy iProxy = (IProxy) Proxy.newProxyInstance(loader, new Class[] { IProxy.class }, proxy);
        iProxy.buyTicket();
    }
}

(6)結果
這裡寫圖片描述

結論

靜態代理和動態代理,他們是從code的本質上去區分的,所以,這兩種的區別也是從程式碼上的實現方式不同。

我們可以看到,在動態代理的實現實現了InvocationHandler這個介面,這個介面呢,也是Java自身給我們提供的一個便捷的動態代理介面,實現該介面,只需重寫和呼叫其方法invoke就可以了

而我也在上一篇文章中說到動態代理模式是:通過反射機制動態的生成代理者的物件,我們在code階段的時候,是不需要知道是誰代理誰,具體代理誰,我們會在執行的時候決定。

所以,我們使用object作為引數傳入,並且在呼叫的時候,也是根據反射,獲取代理類的classloader獲取的,然後動態的構造代理,然後進行呼叫buyTicket()買票方法的

補充:

1、從code區分   

代理分為:靜態代理和動態代理

2、適用範圍

遠端代理:物件在不同的記憶體地址空間提供區域性代理,使得系統可以將Server部分實現隱藏

虛擬代理:物件在真正需要的時候建立,但是又十分消耗資源的時候

保護代理:使用代理控制對物件的訪問許可權

智慧引用:訪問物件時,加上一些自己的執行操作並對指向原始物件的引用計數

以上就是代理模式的基本知識點和實現方式。。。

相關推薦

設計模式工廠方法Factory Method

一 目的    定義一個建立物件的介面,但是讓他的子類去決定初始化哪種型別。工廠方法使得一個類能夠推遲到他的子類去初始化。二 動機    框架運用抽象類來定義和維護物件之間的關係。一個框架經常負責這些物件的建立。考慮一些這麼一個情況:一個能夠展現多個文件的應用程式的框架。在這

淺學設計模式建造者Buildler Pattern模式及在android中的應用

public class Food { private String mFoodName; private String mFoodTastes; private String mFoodFeatures; private String mChillies; private String mSuga

【Java必會】一個保姆與兩隻寵物的“代理”故事動態代理

文章導航: 文章目的: 1、介紹什麼是代理 2、如何理解“代理” 3、代理有哪些實現方式 什麼是代理? 在講解Java代理之前我們先要搞明白什麼是“代理”? 代理:法律上指以他人的名義,在授權範圍內進行對被代理人直接發生法律效力的法律行為。 1.短時間代人擔任職

操作型模式Template Method模板方法模式

1.如果你期望在一個方法中實現一個演算法,把演算法中的某些步驟的定義推遲到子類中去重新定義,可使用Template Method(模板方法)模式 2.舉例 //演算法框架抽象類 public abstract class AbstractMethod {

CSS設計美麗橫排頁面小作品

本次作品與前幾次的作品的不同之處在於:這次頁面是橫排顯示的,即用滑鼠左右滾動來檢視網頁。 作品效果: 可以看出,這個文件的width是遠遠大於height,因為使用橫排的顯示方式來佈局頁面,使用滑鼠左右滾動來顯示。 HTML程式碼: <!DOCTYPE h

設計模式禪學習筆記09--代理模式動態代理

1.動態代理     動態代理還是屬於設計模式--代理模式的一種,代理類在程式執行時建立的代理方式被成為動態代理。動態代理是在實現階段不用關心代理誰,而在執行階段才指定代理哪一個物件。相對來說,自己寫代理類的方式就是靜態代理。現在有一個非常流行的名稱叫做面向橫切面程式設計,也

設計模式代理模式動態代理

概要 設計模式是一門藝術,如果真正瞭解這門藝術,你會發現,世界都將變得更加優美。 簡介 在上一篇已經大概講解了代理模式,相信大家對代理模式有一定的瞭解了,如果沒有 相信大家肯定有收穫,如果有了一定的基礎,那麼在去看,相信理解會更加快,而且非常容易

java設計模式代理模式動態代理

  今天給大家分享的是java設計模式之代理模式中的動態代理模式。如有不足,敬請指正。   我們上次說到靜態代理使用一個代理類

JAVA設計模式——代理動態代理

生成 底層 exe 加載器 use 有一個 隨筆 for oca   傳送門:JAVA設計模式——代理(靜態代理)   序言:   在學習Spring的時候,我們知道Spring主要有兩大思想,一個是IoC,另一個就是AOP,對於IoC,依賴註入就不用多說了,而對於Spri

設計模式--代理模式動態代理

代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服務,而是通過

Java設計模式十二代理模式

一、什麼是代理模式 Proxy模式又叫做代理模式,是構造型的設計模式之一,它可以為其他物件提供一種代理(Proxy)以控制對這個物件的訪問。 所謂代理,是指具有與代理元(被代理的物件)具有相同的介面的類,客戶端必須通過代理與被代理的目標類互動,而代理一般在互動的過程中(互

設計模式》之一文帶你理解單例、JDK動態代理、CGLIB動態代理、靜態代理

個人認為我在動態代理方面的分析算是比較深入了,下次更新再修改一下,爭取做到最好,後續還有建造者模式、模板方法、介面卡、外觀、責任鏈、策略和原型模式的深入!各位讀者如果覺得還不錯的可以持續關注哦。謝謝各位!!! 我的github,到時上傳例子程式碼 https://github.com

設計模式禪學習筆記08--代理模式

1.代理模式     是一個使用率非常高的模式。代理模式也叫委託模式,他是為其他物件提供一種代理以控制對這個物件的訪問     類圖:代理主題角色和具體的主題角色具有相同的抽象主題介面        

java設計模式裝飾模式代理模式區別

初次看裝飾模式的時候首先想到了上節講的代理模式,代理模式與裝飾者模式看起來很像,都實現基礎物件實現的介面,在其自身物件中都儲存著對被代理/被裝飾者的物件引用。 各用一句話描述兩個模式應該是這樣的: 裝飾模式:以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案

設計模式裝飾模式代理模式區別與聯絡

一.你在一個地方寫裝飾,大家就知道這是在增加功能,你寫代理,大家就知道是在限制      1.最常見的代理就是許可權判斷了,許可權就肯定是限制了      2.裝飾模式是指增強被包裝物件的功能        代理模式是修改被代理物件的行為      3.例子:      

代理模式靜態代理,JDK動態代理和cglib動態代理

代理模式,顧名思義,就是通過代理去完成某些功能。比如,你需要購買火車票,不想跑那麼遠到火車站售票視窗買,可以去附近的火車票代售點買,或者到攜程等第三方網站買。這個時候,我們就把火車站叫做目標物件或者委託物件,也可以叫被代理物件,而火車票代售點和攜程就叫做代理物件。 一、靜態代理 靜態代理是最簡單的代理模式。需

設計模式 - 模板模式Template Pattern

process egg lec pass jdbcutils ima tint new sta 引入:這幾天在看一本講spring源碼的書《SPRING技術內幕》裏面在講加載配置文件的時候,可以有不同的加載方式,如根據文件系統目錄加載配置文件(FileSystemXmlAp

設計模式問題集錦

是把 後繼 ogr data- 跟著 沒有 解釋器 space 基本實現 設計模式的主要資料是《大話設計模式》。第一階段先看看各種模式的基本概念。實現每一個模式下的樣例。然後在進行理解性的學習和掌握,靈活掌握各種模式的長處,知道某種模式適合那種狀態。如今,樣

《大話設計模式》——讀後感 8好菜每回味不同——建造者模式基礎案例1

ted builds src ret 分離 args 類圖 rec 方法 建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 建造者模式通常包括下面幾個角色: 1. builder:給出一個抽象接口,以規範產品對象的各個組成成分的

Java設計模式9——創建型模式裝飾模式

block 擴展 str 分享 增加 image tro col 技術 一、概述   動態地給一個對象添加一些額外的職責。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴展對象的功能。   UML簡圖      角