設計模式之代理模式(動態代理)
概要
設計模式是一門藝術,如果真正瞭解這門藝術,你會發現,世界都將變得更加優美。
簡介
在上一篇已經大概講解了代理模式,相信大家對代理模式有一定的瞭解了,如果沒有
相信大家肯定有收穫,如果有了一定的基礎,那麼在去看,相信理解會更加快,而且非常容易明白。
程式碼演示
因為上一篇已經比較詳細的分析過了,所以直接上程式碼了
(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簡圖 角