溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java描述設(shè)計(jì)模式(16):代理模式

發(fā)布時(shí)間:2020-07-30 18:31:21 來源:網(wǎng)絡(luò) 閱讀:110 作者:知了一笑 欄目:編程語言

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、生活場(chǎng)景

1、場(chǎng)景描述

在電商高速發(fā)展的今天,快遞的數(shù)量十分龐大,甚至出現(xiàn)了快遞代理行業(yè),簡(jiǎn)單的說就是快遞的主人沒有時(shí)間收快遞,會(huì)指定一個(gè)快遞的代收點(diǎn),比如快遞柜,快遞驛站等,然后等有時(shí)間的時(shí)候再過去取,下面使用代碼對(duì)這個(gè)場(chǎng)景進(jìn)行簡(jiǎn)單的描述。

2、場(chǎng)景圖解

Java描述設(shè)計(jì)模式(16):代理模式

3、源碼實(shí)現(xiàn)

public class C01_InScene {
    public static void main(String[] args) {
        /*自己收快遞的測(cè)試方式*/
        GetExpress getExpress = new GetExpress();
        getExpress.sureInfo();
        getExpress.signName("張三");
        /*代收快遞的測(cè)試方式*/
        ExpressAct getUser = new GetExpress();
        ExpressAct getProxy = new ProxyExpress(getUser);
        getProxy.sureInfo();
        getProxy.signName("李四");
    }
}
/**
 * 接收一個(gè)快遞的動(dòng)作接口:確認(rèn)信息,簽名
 */
interface ExpressAct{
    void sureInfo();
    void signName(String name);
}
/**
 * 定義一個(gè)類接收快遞:自己去拿快遞
 */
class GetExpress implements ExpressAct{
    @Override
    public void sureInfo() {
        System.out.println("請(qǐng)確認(rèn)你的個(gè)人信息!");
    }
    @Override
    public void signName(String name) {
        System.out.println("你的名字是:"+name);
    }
}
/**
 * 定義一個(gè)類接收快遞:找人代領(lǐng)快遞
 */
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);
    }
}

二、代理模式

1、概念描述

代理模式是對(duì)象的結(jié)構(gòu)模式。代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)原對(duì)象的引用。所謂代理,就是一個(gè)對(duì)象代表另一個(gè)對(duì)象執(zhí)行相應(yīng)的動(dòng)作程序。而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。

2、模式圖解

Java描述設(shè)計(jì)模式(16):代理模式

3、核心角色

  • 抽象對(duì)象角色

聲明目標(biāo)對(duì)象和代理對(duì)象的共同接口。

  • 目標(biāo)對(duì)象角色

定義了代理對(duì)象所代表的目標(biāo)對(duì)象。

  • 代理對(duì)象角色

代理對(duì)象內(nèi)部含有目標(biāo)對(duì)象的引用,可以在任何時(shí)候操作目標(biāo)對(duì)象;代理對(duì)象提供一個(gè)與目標(biāo)對(duì)象相同的接口,可以在任何時(shí)候替代目標(biāo)對(duì)象。代理對(duì)象通常在客戶端調(diào)用傳遞給目標(biāo)對(duì)象之前或之后,執(zhí)行某個(gè)操作,而不是單純地將調(diào)用傳遞給目標(biāo)對(duì)象,AOP編程就是基于這個(gè)思想。

4、源碼實(shí)現(xiàn)

public class C02_Proxy {
    public static void main(String[] args) {
        AbstractObject object = new ProxyObject();
        object.operation();
    }
}
/**
 * 抽象對(duì)象角色
 */
abstract class AbstractObject{
    public abstract void operation();
}
/**
 * 目標(biāo)對(duì)象角色
 */
class TargetObject extends AbstractObject{
    @Override
    public void operation() {
        System.out.println("Target Method Run...");
    }
}
/**
 * 代理對(duì)象角色
 */
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動(dòng)態(tài)代理

基于JDK動(dòng)態(tài)代理方式實(shí)現(xiàn)AOP切面編程。

1、代碼實(shí)現(xiàn)

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("目標(biāo)方法【getBook】被執(zhí)行");
        return "高性能MySQL";
    }
}
class BookAopProxyFactory {
    public static BookService createService() {
        // 目標(biāo)類
        final BookService bookService = new BookServiceImpl() ;
        // 切面類
        final BookAspect bookAspect = new BookAspect();
        /*
         * 代理類:將目標(biāo)類(切入點(diǎn))和 切面類(通知) 結(jié)合
         */
        BookService proxyBookService = (BookService) Proxy.newProxyInstance(
                BookAopProxyFactory.class.getClassLoader(),
                bookService.getClass().getInterfaces(),
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method,
                                         Object[] args) throws Throwable {
                        // 前執(zhí)行
                        bookAspect.before();
                        // 執(zhí)行目標(biāo)類的方法
                        Object obj = method.invoke(bookService, args);
                        // 后執(zhí)行
                        bookAspect.after();
                        return obj;
                    }
                });
        return proxyBookService ;
    }
}

四、幾種常見代理

  • 防火墻代理

內(nèi)網(wǎng)通過代理穿透防火墻,實(shí)現(xiàn)對(duì)公網(wǎng)的訪問。

  • 緩存代理

為了緩解網(wǎng)站并發(fā)壓力,在請(qǐng)求數(shù)據(jù)庫資源時(shí),先取緩存中代理的數(shù)據(jù),如果緩存未命中,再到數(shù)據(jù)庫取數(shù)據(jù),然后緩存取到的數(shù)據(jù)。

  • 遠(yuǎn)程代理

遠(yuǎn)程對(duì)象的本地代理對(duì)象,通過它可以把遠(yuǎn)程對(duì)象當(dāng)本地對(duì)象調(diào)用 。遠(yuǎn)程代理通過網(wǎng)絡(luò)和調(diào)用的遠(yuǎn)程對(duì)象進(jìn)行信息交互 。

  • 同步代理

主要使用在多線程編程中,完成多線程間同步工作。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述設(shè)計(jì)模式(16):代理模式

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI