国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

代理模式【靜態(tài)代理和動(dòng)態(tài)代理實(shí)現(xiàn)業(yè)務(wù)功能擴(kuò)展】

這篇具有很好參考價(jià)值的文章主要介紹了代理模式【靜態(tài)代理和動(dòng)態(tài)代理實(shí)現(xiàn)業(yè)務(wù)功能擴(kuò)展】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

靜態(tài)代理

  • 我們?cè)诓恍薷臉I(yè)務(wù)的情況下想要給它增加一些功能,這就需要使用代理模式。
  • 我們不會(huì)在原有業(yè)務(wù)上直接修改,為了避免修改導(dǎo)致程序不可逆轉(zhuǎn)的破壞。
  • 三種角色:抽象角色-接口、真實(shí)角色-實(shí)現(xiàn)類(lèi)和代理角色-代理類(lèi)。
  • 真實(shí)角色和代理角色繼承的是同一個(gè)抽象角色接口!

業(yè)務(wù)接口類(lèi)?

負(fù)責(zé)抽象出業(yè)務(wù)需要的功能。

//抽象業(yè)務(wù)
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

業(yè)務(wù)的實(shí)現(xiàn)類(lèi)

public class UserServiceImpl implements UserService{
    @Override
    public void add() {
        System.out.println("增加了一個(gè)用戶(hù)");
    }

    @Override
    public void delete() {
        System.out.println("刪除了一個(gè)用戶(hù)");
    }

    @Override
    public void update() {
        System.out.println("修改了一個(gè)用戶(hù)");
    }

    @Override
    public void query() {
        System.out.println("查詢(xún)了一個(gè)用戶(hù)");
    }
}

代理類(lèi)

假如我們現(xiàn)在要給業(yè)務(wù)增加一個(gè)新的功能-輸出日志功能,我們需要通過(guò)一個(gè)代理類(lèi)來(lái)實(shí)現(xiàn) ,而不是直接在舊業(yè)務(wù)上修改代碼。

我們?cè)黾右粋€(gè) log 方法(拓展功能),我們需要一個(gè) set 方法來(lái)使代理能夠通過(guò)舊的實(shí)現(xiàn)類(lèi)調(diào)用舊的業(yè)務(wù)。


//代理實(shí)現(xiàn)增刪改查
public class UserServiceProxy implements UserService{

    UserServiceImpl userService;

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    @Override
    public void add() {
        log("add");
        userService.add();
    }

    @Override
    public void delete() {
        log("delete");
        userService.delete();
    }

    @Override
    public void update() {
        log("update");
        userService.update();
    }

    @Override
    public void query() {
        log("query");
        userService.query();
    }

    public void log(String message){
        System.out.println("使用了" + message + "方法");
    }
}

測(cè)試

這樣我們的只需要給代理設(shè)置舊業(yè)務(wù)的實(shí)現(xiàn)類(lèi)就實(shí)現(xiàn)了業(yè)務(wù)的功能擴(kuò)展。

public class Client {
    public static void main(String[] args) {
        UserServiceImpl service = new UserServiceImpl();
        UserServiceProxy proxy = new UserServiceProxy();
        proxy.setUserService(service);
        proxy.add();
    }
}

動(dòng)態(tài)代理

  • 動(dòng)態(tài)代理個(gè)靜態(tài)代理角色一樣(抽象角色-接口、真實(shí)角色-實(shí)現(xiàn)類(lèi)和代理角色-代理類(lèi))
  • 動(dòng)態(tài)代理的代理類(lèi)是通過(guò)反射動(dòng)態(tài)生成的!
  • 動(dòng)態(tài)代理按照實(shí)現(xiàn)可以分我:基于接口的 和 基于類(lèi)的動(dòng)態(tài)代理。
    • 基于接口:JDK 動(dòng)態(tài)代理
    • 基于類(lèi):cglib
  • 需要了解兩個(gè)類(lèi):Proxy:代理、InvocationHandler:調(diào)用處理程序。
  • 一個(gè)動(dòng)態(tài)代理類(lèi)就是一個(gè)接口!
  • 一個(gè)動(dòng)態(tài)代理類(lèi)可以代理多個(gè)真實(shí)角色類(lèi),只需要繼承同一個(gè)業(yè)務(wù)接口即可。
  • 使用動(dòng)態(tài)代理可以大大減少代碼量!因?yàn)樗褂昧朔瓷洌?/li>

Proxy:

代理模式【靜態(tài)代理和動(dòng)態(tài)代理實(shí)現(xiàn)業(yè)務(wù)功能擴(kuò)展】,Spring,設(shè)計(jì)模式,代理模式,java,spring

Proxy 一共只有4個(gè)方法:

代理模式【靜態(tài)代理和動(dòng)態(tài)代理實(shí)現(xiàn)業(yè)務(wù)功能擴(kuò)展】,Spring,設(shè)計(jì)模式,代理模式,java,spring?

?

?InvocationHandler:

InvocationHandler是一個(gè)接口!

代理模式【靜態(tài)代理和動(dòng)態(tài)代理實(shí)現(xiàn)業(yè)務(wù)功能擴(kuò)展】,Spring,設(shè)計(jì)模式,代理模式,java,spring

InvocationHandler 整個(gè)類(lèi)里只有一個(gè)方法:invoke方法。?

代理模式【靜態(tài)代理和動(dòng)態(tài)代理實(shí)現(xiàn)業(yè)務(wù)功能擴(kuò)展】,Spring,設(shè)計(jì)模式,代理模式,java,spring

?動(dòng)態(tài)代理的實(shí)現(xiàn)

抽象角色

//抽象業(yè)務(wù)
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

真實(shí)角色

public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("增加了一個(gè)用戶(hù)");
    }

    @Override
    public void delete() {
        System.out.println("刪除了一個(gè)用戶(hù)");
    }

    @Override
    public void update() {
        System.out.println("修改了一個(gè)用戶(hù)");
    }

    @Override
    public void query() {
        System.out.println("查詢(xún)了一個(gè)用戶(hù)");
    }
}

代理角色

使用 Object 作為抽象角色,這樣這一個(gè)代理類(lèi)就可以當(dāng)做工具類(lèi)來(lái)給任何真實(shí)角色進(jìn)行功能擴(kuò)展!

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//代理處理程序
public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口
    private Object target;

    public void setUserService(Object target) {
        this.target = target;
    }

    //生成并得到代理類(lèi)
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
    }

    //處理代理實(shí)例,調(diào)用抽象接口的方法,并返回結(jié)果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //動(dòng)態(tài)代理的本質(zhì)就是使用反射機(jī)制實(shí)現(xiàn)!
        fun1();
        log(method.getName());
        Object result = method.invoke(target, args);
        fun2();
        return result;
    }

    public void fun1(){
        System.out.println("擴(kuò)展功能1");
    }
    public void fun2(){
        System.out.println("擴(kuò)展功能2");
    }
    public void log(String message){
        System.out.println("執(zhí)行了" + message + "方法");
    }
}

測(cè)試

public class Client {
    public static void main(String[] args) {
        //真實(shí)角色
        UserServiceImpl userService = new UserServiceImpl();
        //代理角色
        ProxyInvocationHandler handler = new ProxyInvocationHandler();
        //設(shè)置要代理的真實(shí)對(duì)象
        handler.setUserService(userService);

        //動(dòng)態(tài)生成代理類(lèi)
        UserService proxy = (UserService) handler.getProxy();
        proxy.add();
        proxy.delete();

    }
}

輸出結(jié)果:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-592899.html

擴(kuò)展功能1
執(zhí)行了add方法
增加了一個(gè)用戶(hù)
擴(kuò)展功能2
擴(kuò)展功能1
執(zhí)行了delete方法
刪除了一個(gè)用戶(hù)
擴(kuò)展功能2

到了這里,關(guān)于代理模式【靜態(tài)代理和動(dòng)態(tài)代理實(shí)現(xiàn)業(yè)務(wù)功能擴(kuò)展】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 代理設(shè)計(jì)模式——靜態(tài)代理和動(dòng)態(tài)代理

    代理設(shè)計(jì)模式——靜態(tài)代理和動(dòng)態(tài)代理

    代理模式 在代理模式(Proxy Pattern)中,一個(gè)類(lèi)代表另一個(gè)類(lèi)的功能。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,在代理模式中,我們創(chuàng)建具有現(xiàn)有對(duì)象的對(duì)象,以便向外界提供功能接口。 意圖: 為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。 主要解決: 在直接訪(fǎng)問(wèn)對(duì)象時(shí)

    2024年02月13日
    瀏覽(27)
  • 代理模式:靜態(tài)代理+JDK/CGLIB 動(dòng)態(tài)代理

    代理模式:靜態(tài)代理+JDK/CGLIB 動(dòng)態(tài)代理

    代理模式是一種比較好理解的設(shè)計(jì)模式。簡(jiǎn)單來(lái)說(shuō)就是 我們使用代理對(duì)象來(lái)代替對(duì)真實(shí)對(duì)象(real object)的訪(fǎng)問(wèn),這樣就可以在不修改原目標(biāo)對(duì)象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對(duì)象的功能。 代理模式的主要作用是擴(kuò)展目標(biāo)對(duì)象的功能,比如說(shuō)在目標(biāo)對(duì)象的某個(gè)方法

    2024年02月13日
    瀏覽(24)
  • 溫故知新之:代理模式,靜態(tài)代理和動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理)

    溫故知新之:代理模式,靜態(tài)代理和動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理)

    代理模式可以在不修改被代理對(duì)象的基礎(chǔ)上,通過(guò)擴(kuò)展代理類(lèi),進(jìn)行一些功能的附加與增強(qiáng)。 靜態(tài)代理 是一種代理模式的實(shí)現(xiàn)方式,它在編譯期間就已經(jīng)確定了代理對(duì)象,需要為每一個(gè)被代理對(duì)象創(chuàng)建一個(gè)代理類(lèi)。靜態(tài)代理的實(shí)現(xiàn)比較簡(jiǎn)單,但是每個(gè)被代理對(duì)象都需要?jiǎng)?chuàng)建

    2024年02月11日
    瀏覽(30)
  • Spring AOP與靜態(tài)代理/動(dòng)態(tài)代理

    Spring AOP與靜態(tài)代理/動(dòng)態(tài)代理

    代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許對(duì)象提供替代品或占位符,以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。代理對(duì)象通常充當(dāng)客戶(hù)端和實(shí)際服務(wù)對(duì)象之間的中介,以實(shí)現(xiàn)對(duì)服務(wù)對(duì)象的間接訪(fǎng)問(wèn)。 代理模式的實(shí)現(xiàn)有許多種方式,其中最常見(jiàn)的方式是靜態(tài)代理和動(dòng)態(tài)代理。 靜態(tài)代理是指,

    2024年02月10日
    瀏覽(27)
  • Java 代理模式詳解,靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別及優(yōu)缺點(diǎn)

    代理模式是一種常用的設(shè)計(jì)模式,它允許通過(guò)引入一個(gè)代理對(duì)象來(lái)控制對(duì)目標(biāo)對(duì)象的訪(fǎng)問(wèn)。在Java中,代理模式被廣泛應(yīng)用,它可以提供額外的功能,如權(quán)限檢查、緩存、日志記錄等,同時(shí)還能在不修改目標(biāo)對(duì)象的情況下對(duì)其進(jìn)行擴(kuò)展。 代理模式(Proxy Pattern)是指通過(guò)代理對(duì)象

    2024年02月11日
    瀏覽(27)
  • 代理模式 靜態(tài)代理和動(dòng)態(tài)代理(jdk、cglib)——Java入職第十一天

    代理模式 靜態(tài)代理和動(dòng)態(tài)代理(jdk、cglib)——Java入職第十一天

    ? ? ? ? 一個(gè)類(lèi)代表另一個(gè)類(lèi)去完成擴(kuò)展功能,在主體類(lèi)的基礎(chǔ)上,新增一個(gè)代理類(lèi),擴(kuò)展主體類(lèi)功能,不影響主體,完成額外功能。比如買(mǎi)車(chē)票,可以去代理點(diǎn)買(mǎi),不用去火車(chē)站,主要包括靜態(tài)代理和動(dòng)態(tài)代理兩種模式。 代理類(lèi)中包含了主體類(lèi) 無(wú)法根據(jù)業(yè)務(wù)擴(kuò)展,每一次

    2024年02月10日
    瀏覽(26)
  • 代理模式以及靜態(tài)代理、JDK代理、Cglib代理的實(shí)現(xiàn)

    代理模式以及靜態(tài)代理、JDK代理、Cglib代理的實(shí)現(xiàn)

    介紹 1、代理模式:為對(duì)象 提供一個(gè)替身 ,以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn),即通過(guò)代理對(duì)象訪(fǎng)問(wèn)目標(biāo)對(duì)象,這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作 (即: 擴(kuò)展目標(biāo)對(duì)象的功能 ,例如Spring AOP) 2、被代理的對(duì)象可以是 遠(yuǎn)程對(duì)象 ,創(chuàng)建開(kāi)銷(xiāo)大的對(duì)象

    2024年03月12日
    瀏覽(26)
  • JavaScript代理模式:如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)代理

    在JavaScript中,代理模式是一種常見(jiàn)的設(shè)計(jì)模式,它允許我們?cè)诓桓淖儗?duì)象本身的情況下,通過(guò)代理對(duì)象來(lái)控制對(duì)象的訪(fǎng)問(wèn)。代理模式可以用于實(shí)現(xiàn)緩存、權(quán)限控制、遠(yuǎn)程調(diào)用等功能。 代理模式是指在訪(fǎng)問(wèn)對(duì)象時(shí)引入一定程度的間接性,因?yàn)檫@種間接性可以附加多種用途,所

    2024年02月11日
    瀏覽(22)
  • 【業(yè)務(wù)功能篇20】Springboot java邏輯實(shí)現(xiàn)動(dòng)態(tài)行轉(zhuǎn)列需求

    【業(yè)務(wù)功能篇20】Springboot java邏輯實(shí)現(xiàn)動(dòng)態(tài)行轉(zhuǎn)列需求

    在此前,我也寫(xiě)過(guò)一個(gè)行轉(zhuǎn)列的文章,是用存儲(chǔ)過(guò)程sql處理的一個(gè)動(dòng)態(tài)的邏輯 Mysql 存儲(chǔ)過(guò)程Mybatis框架call調(diào)用 實(shí)現(xiàn)動(dòng)態(tài)行轉(zhuǎn)列 那么后面我們同樣又接收了業(yè)務(wù)的一個(gè)新需求,針對(duì)的是不同的業(yè)務(wù)數(shù)據(jù),做的同樣的一個(gè)展示數(shù)據(jù)報(bào)表,同樣還是產(chǎn)品歸屬信息表頭,拼接查詢(xún)年

    2024年02月09日
    瀏覽(32)
  • 如何使用靜態(tài)IP代理解決Facebook多賬號(hào)注冊(cè)并進(jìn)行網(wǎng)絡(luò)推廣業(yè)務(wù)?

    如何使用靜態(tài)IP代理解決Facebook多賬號(hào)注冊(cè)并進(jìn)行網(wǎng)絡(luò)推廣業(yè)務(wù)?

    在當(dāng)今的數(shù)字時(shí)代,社交媒體成為了企業(yè)進(jìn)行網(wǎng)絡(luò)推廣的一個(gè)重要途徑,其中,F(xiàn)acebook是最受歡迎的社交媒體之一,因?yàn)樗梢宰屍髽I(yè)通過(guò)創(chuàng)建廣告和頁(yè)面來(lái)推廣他們的產(chǎn)品或服務(wù)。 但是,使用Facebook進(jìn)行網(wǎng)絡(luò)推廣時(shí),很多企業(yè)會(huì)面臨一個(gè)問(wèn)題:不能大量注冊(cè)賬號(hào)。那么,這

    2024年01月25日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包