本文源碼:GitHub·點這裏 || GitEE·點這裏git
在電商高速發展的今天,快遞的數量十分龐大,甚至出現了快遞代理行業,簡單的說就是快遞的主人沒有時間收快遞,會指定一個快遞的代收點,好比快遞櫃,快遞驛站等,而後等有時間的時候再過去取,下面使用代碼對這個場景進行簡單的描述。github
public class C01_InScene { public static void main(String[] args) { /*本身收快遞的測試方式*/ GetExpress getExpress = new GetExpress(); getExpress.sureInfo(); getExpress.signName("張三"); /*代收快遞的測試方式*/ ExpressAct getUser = new GetExpress(); ExpressAct getProxy = new ProxyExpress(getUser); getProxy.sureInfo(); getProxy.signName("李四"); } } /** * 接收一個快遞的動做接口:確認信息,簽名 */ interface ExpressAct{ void sureInfo(); void signName(String name); } /** * 定義一個類接收快遞:本身去拿快遞 */ class GetExpress implements ExpressAct{ @Override public void sureInfo() { System.out.println("請確認你的我的信息!"); } @Override public void signName(String name) { System.out.println("你的名字是:"+name); } } /** * 定義一個類接收快遞:找人代領快遞 */ class ProxyExpress implements ExpressAct{ private ExpressAct expressAct=null; public ProxyExpress(ExpressAct expressAct){ this.expressAct = expressAct; } @Override public void sureInfo() { this.expressAct.sureInfo(); } @Override public void signName(String name) { this.expressAct.signName(name); } }
代理模式是對象的結構模式。代理模式給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用。所謂代理,就是一個對象表明另外一個對象執行相應的動做程序。而代理對象能夠在客戶端和目標對象之間起到中介的做用。數據庫
聲明目標對象和代理對象的共同接口。express
定義了代理對象所表明的目標對象。編程
代理對象內部含有目標對象的引用,能夠在任什麼時候候操做目標對象;代理對象提供一個與目標對象相同的接口,能夠在任什麼時候候替代目標對象。代理對象一般在客戶端調用傳遞給目標對象以前或以後,執行某個操做,而不是單純地將調用傳遞給目標對象,AOP編程就是基於這個思想。緩存
public class C02_Proxy { public static void main(String[] args) { AbstractObject object = new ProxyObject(); object.operation(); } } /** * 抽象對象角色 */ abstract class AbstractObject{ public abstract void operation(); } /** * 目標對象角色 */ class TargetObject extends AbstractObject{ @Override public void operation() { System.out.println("Target Method Run..."); } } /** * 代理對象角色 */ class ProxyObject extends AbstractObject{ TargetObject targetObject = new TargetObject(); @Override public void operation() { System.out.println("Method Before..."); targetObject.operation(); System.out.println("Method After..."); } }
基於JDK動態代理方式實現AOP切面編程。網絡
public class C03_JdkProxy { public static void main(String[] args) { BookService bookService = BookAopProxyFactory.createService() ; System.out.println(bookService.getBook()); } } class BookAspect { public void before (){ System.out.println("Method Before ..."); } public void after (){ System.out.println("Method After ..."); } } interface BookService { String getBook () ; } class BookServiceImpl implements BookService { @Override public String getBook() { System.out.println("目標方法【getBook】被執行"); return "高性能MySQL"; } } class BookAopProxyFactory { public static BookService createService() { // 目標類 final BookService bookService = new BookServiceImpl() ; // 切面類 final BookAspect bookAspect = new BookAspect(); /* * 代理類:將目標類(切入點)和 切面類(通知) 結合 */ BookService proxyBookService = (BookService) Proxy.newProxyInstance( BookAopProxyFactory.class.getClassLoader(), bookService.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 前執行 bookAspect.before(); // 執行目標類的方法 Object obj = method.invoke(bookService, args); // 後執行 bookAspect.after(); return obj; } }); return proxyBookService ; } }
內網經過代理穿透防火牆,實現對公網的訪問。多線程
爲了緩解網站併發壓力,在請求數據庫資源時,先取緩存中代理的數據,若是緩存未命中,再到數據庫取數據,而後緩存取到的數據。併發
遠程對象的本地代理對象,經過它能夠把遠程對象當本地對象調用 。遠程代理經過網絡和調用的遠程對象進行信息交互 。ide
主要使用在多線程編程中,完成多線程間同步工做。
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent