日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > 框架設(shè)計 > 設(shè)計模式(八)代理模式(Proxy)-結(jié)構(gòu)型

設(shè)計模式(八)代理模式(Proxy)-結(jié)構(gòu)型

來源:程序員人生   發(fā)布時間:2015-05-07 09:40:14 閱讀次數(shù):3305次

Proxy 代理模式:解耦

平常開發(fā)中的日志權(quán)限事務(wù)處理等。

實現(xiàn)原理:

  • 1個抽象目標(biāo)類即1個接口,有相干方法名;
  • 1個具體目標(biāo)類,實現(xiàn)該接口和相干的方法;
  • 1個代理類,調(diào)用目標(biāo)具體類并加上自己需要的邏輯;
  • 客戶端實例化代理類,調(diào)用代理類的方法

代理模式實現(xiàn)原理圖
代理模式原理圖


代理模式

代理模式:是經(jīng)常使用的java設(shè)計模式,他的特點是代理類與拜托類有一樣的接口,代理類主要負(fù)責(zé)為拜托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給拜托類,和事后處理消息等。代理類與拜托類之間通常會存在關(guān)聯(lián)關(guān)系,1個代理類的對象與1個拜托類的對象關(guān)聯(lián),代理類的對象本身其實不真正實現(xiàn)服務(wù),而是通過調(diào)用拜托類的對象的相干方法,來提供特定的服務(wù)。
依照代理的創(chuàng)建時期,代理類可以分為兩種。
靜態(tài)代理:由程序員創(chuàng)建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已存在了。
動態(tài)代理:在程序運行時,應(yīng)用反射機制動態(tài)創(chuàng)建而成。

靜態(tài)代理模式以下:

1.抽象目標(biāo)類

public interface Subject(){ public void Request(); }

2.具體目標(biāo)類

public class RealSubject implements Subject(){ public void Request(){ }; }

3.代理類

public class Proxy (){ private RealSubject realSubject; public void Request(){ /**附加邏輯**/ realSubject.Request(); /**附加邏輯**/ }; }

動態(tài)代理: JDK動態(tài)代理

JDK動態(tài)的代理的3個主要類:
Proxy:代理類
InvocationHandler: 接口
Method:要被調(diào)用的方法
TaxInterface.java

public interface TaxInterface { public void doTax(); }

Tax.java

public class Tax implements TaxInterface{ @Override public void doTax() { System.out.println("進(jìn)行所得稅計算的邏輯處理"); } }

TimeProxy.java

public class TimeProxy implements InvocationHandler{ private Object obj; //綁定代理對象 public Object bind(Object obj){ this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } //實現(xiàn)代理 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { long startTime = System.nanoTime(); result = method.invoke(obj, args); long endTime = System.nanoTime(); System.out.println("計算程序運行時間 :" +(endTime-startTime)); } catch (Exception e) { e.printStackTrace(); } return result; } }

客戶端測試:Client.java

public class Client { public static void main(String[] args) { TimeProxy timeProxy = new TimeProxy(); TaxInterface taxInterface = (TaxInterface)timeProxy.bind(new Tax()); taxInterface.doTax(); } }

JDK的動態(tài)代理依托接口實現(xiàn),如果有些類并沒有實現(xiàn)接口,則不能使用JDK代理,這就要使用cglib動態(tài)代理了。

Cglib動態(tài)代理

JDK的動態(tài)代理機制只能代理實現(xiàn)了接口的類,而不能實現(xiàn)接口的類就不能實現(xiàn)JDK的動態(tài)代理,cglib是針對類來實現(xiàn)代理的,他的原理是對指定的目標(biāo)類生成1個子類,并覆蓋其中方法實現(xiàn)增強,但由于采取的是繼承,所以不能對final修飾的類進(jìn)行代理。
示例以下:
BookFacadeCglib.java

package com.ldw.dao; public interface BookFacade { public void addBook(); }

BookCadeImpl1.java

package com.ldw.dao.impl; /** * 這個是沒有實現(xiàn)接口的實現(xiàn)類 * * @author csu.ldw * */ public class BookFacadeImpl1 { public void addBook() { System.out.println("增加圖書的普通方法..."); } }

BookFacadeProxy.java

package com.ldw.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /** * 使用cglib動態(tài)代理 * * @author student * */ public class BookFacadeCglib implements MethodInterceptor { private Object target; /** * 創(chuàng)建代理對象 * * @param target * @return */ public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回調(diào)方法 enhancer.setCallback(this); // 創(chuàng)建代理對象 return enhancer.create(); } @Override // 回調(diào)方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事物開始"); proxy.invokeSuper(obj, args); System.out.println("事物結(jié)束"); return null; } }

TestCglib.java

package com.ldw.test; import net.battier.dao.impl.BookFacadeImpl1; import net.battier.proxy.BookFacadeCglib; public class TestCglib { public static void main(String[] args) { BookFacadeCglib cglib=new BookFacadeCglib(); BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(new BookFacadeImpl1()); bookCglib.addBook(); } }

利用

SpringAOP、Struts攔截器、日志管理等。

附加

struts2的攔截器屬于AOP思想,采取了代理模式

struts2中,最重要的1個類是org.apache.struts2.dispatcher.FilterDispatcher用戶通過閱讀器提交1個HttpServletRequest要求后,要求被在web.xml中的過濾器FilterDispatcher攔截在FilterDispatcher過濾器中首先詢問ActionMapper是不是需要調(diào)用某個Action來處理要求,如果ActionMapper決定需要調(diào)用某個要求,F(xiàn)ilterDispatcher則把要求的處理交給ActionProxy,ActionProxy通過配置文件struts.xml找到需要調(diào)用的Action類,然后ActionProxy創(chuàng)建1個ActionInvocation實例并通用該Action但在調(diào)用之前,ActionInvocation會根據(jù)配置加載Action相干的Intercepter,等Action履行終了,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的Result結(jié)果。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产不卡一二三 | 久久国产精品一区 | 久久国产精品偷 | av噜噜噜噜 | 一级特黄录像免费观看 | 一区二区自拍 | 亚洲成人一区 | 让男人欲仙欲死的床技 | 一区二区日韩精品 | 亚洲国产黄色 | 日本一区二区三区在线观看 | 成人福利在线视频 | 一区二区三区四区国产 | 亚洲精品电影在线 | 国产一区日韩 | 在线观看中文字幕国产 | 欧美在线免费观看 | 色五月成人 | 九九热精品视频在线观看 | 成人在线一区二区三区 | 精品影院 | 久久69精品久久久久久久电影好 | 成人国产精品视频 | 国产精品不卡在线 | 国产精品婷婷久久久久 | 国产区在线 | 国产网红女主播免费视频 | 中文字幕日韩视频 | 国产成人一区二区三区 | 久草在线观看首页 | 亚洲一二三四区电影 | 欧美精品一二区 | 精品无码久久久久久国产 | 久久精品视频在线 | 日韩精品免费一区二区三区 | 日本网站免费观看 | 国产黄a三级三级三级老师 国产麻豆精品一区二区 | 殴美一级片 | 精品无码久久久久久国产 | 国产精品视频一区二区三区四 | 嫩草影院在线观看视频 |