大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

面試題首頁 > 設(shè)計模式面試題

代理模式面試題

001什么是代理模式?

給目標(biāo)對象提供一個代理對象,并由代理對象控制對目標(biāo)對象的引用。其中代理對象起到中介作用,用于連接客戶端和目標(biāo)對象。例如:電腦桌面的快捷方式。電腦對某個程序提供一個快捷方式(代理對象),快捷方式連接客戶端和程序,客戶端通過操作快捷方式就可以操作那個程序。
通過引入代理對象的方式來間接訪問目標(biāo)對象,防止直接訪問目標(biāo)對象給系統(tǒng)帶來的不必要復(fù)雜性。

002代理模式的具體實現(xiàn)?

步驟1: 創(chuàng)建抽象對象接口(Subject):聲明你(真實對象)需要讓代購(代理對象)幫忙做的事(買Mac)

public interface Subject { ?
    public void buyMac();
}

步驟2: 創(chuàng)建真實對象類(RealSubject),即”我“

public class RealSubject implement Subject{
? ?@Override
?  public void buyMac() { ?
?  ? ? System.out.println(”買一臺Mac“); ?
?  } ?
}

步驟3:創(chuàng)建代理對象類(Proxy),即”代購“,并通過代理類創(chuàng)建真實對象實例并訪問其方法

public class Proxy ?implements Subject{
??
? ?@Override
?  public void buyMac{ ??
?  ? //引用并創(chuàng)建真實對象實例,即”我“
?  ? RealSubject realSubject = new RealSubject();
?  ? //調(diào)用真實對象的方法,進行代理購買Mac
?  ? realSubject.buyMac();
?  ? //代理對象額外做的操作
?  ? this.WrapMac();
?  }
? ?public void WrapMac(){
?  ? System.out.println(”用盒子包裝好Mac“); ?
?  }
}

步驟4:客戶端調(diào)用

public class ProxyPattern {
? ? public static void main(String[] args){
? ? Subject proxy = new Proxy();
? ?   proxy.buyMac();
? ? }? ? ??
}

結(jié)果輸出
買一臺Mac
用盒子包裝好Mac

003代理模式的優(yōu)缺點?

優(yōu)點
協(xié)調(diào)調(diào)用者和被調(diào)用者,降低了系統(tǒng)的耦合度
代理對象作為客戶端和目標(biāo)對象之間的中介,起到了保護目標(biāo)對象的作用
缺點
由于在客戶端和真實主題之間增加了代理對象,因此會造成請求的處理速度變慢;
實現(xiàn)代理模式需要額外的工作(有些代理模式的實現(xiàn)非常復(fù)雜),從而增加了系統(tǒng)實現(xiàn)的復(fù)雜度。

004代理模式應(yīng)用場景?

005為什么要使用動態(tài)代理?

在靜態(tài)代理模式中一個靜態(tài)代理只服務(wù)一種類型的目標(biāo)對象,若要服務(wù)多類型的目標(biāo)對象,則需要為每種目標(biāo)對象都實現(xiàn)一個靜態(tài)代理對象。在目標(biāo)對象較多的情況下,若采用靜態(tài)代理,則會出現(xiàn) 靜態(tài)代理對象量多、代碼量大,從而導(dǎo)致代碼復(fù)雜的問題。

006什么是動態(tài)代理?

動態(tài)代理就是,在程序運行期,創(chuàng)建目標(biāo)對象的代理對象,并對目標(biāo)對象中的方法進行功能性增強的一種技術(shù)。在生成代理對象的過程中,目標(biāo)對象不變,代理對象中的方法是目標(biāo)對象方法的增強方法。可以理解為運行期間,對象中方法的動態(tài)攔截,在攔截方法的前后執(zhí)行功能操作。
代理類在程序運行期間,創(chuàng)建的代理對象稱之為動態(tài)代理對象。這種情況下,創(chuàng)建的代理對象,并不是事先在Java代碼中定義好的。而是在運行期間,根據(jù)我們在動態(tài)代理對象中的“指示”,動態(tài)生成的。也就是說,你想獲取哪個對象的代理,動態(tài)代理就會為你動態(tài)的生成這個對象的代理對象。動態(tài)代理可以對被代理對象的方法進行功能增強。有了動態(tài)代理的技術(shù),那么就可以在不修改方法源碼的情況下,增強被代理對象的方法的功能,在方法執(zhí)行前后做任何你想做的事情。

007動態(tài)代理模式的原理?

1)動態(tài)代理不需要顯式實現(xiàn)與目標(biāo)對象類(RealSubject)相同的接口,而是將這種實現(xiàn)推遲到程序運行時由 JVM來實現(xiàn)。即:在使用時再創(chuàng)建動態(tài)代理類 & 實例;
2)通過Java 反射機制的method.invoke(),通過調(diào)用動態(tài)代理類對象方法,從而自動調(diào)用目標(biāo)對象的方法。

008動態(tài)代理的優(yōu)點和缺點?

優(yōu)點
1)只需要1個動態(tài)代理類就可以解決創(chuàng)建多個靜態(tài)代理的問題,避免重復(fù)、多余代碼;
2)更強的靈活性;
缺點
1)效率低:相比靜態(tài)代理中直接調(diào)用目標(biāo)對象方法,動態(tài)代理則需要先通過Java反射機制 從而間接調(diào)用目標(biāo)對象方法。
2)應(yīng)用場景局限:Java 的單繼承特性(每個代理類都繼承了 Proxy 類),即只能針對接口創(chuàng)建代理類,不能針對類創(chuàng)建代理類。

009動態(tài)代理的應(yīng)用場景。

日志記錄、性能統(tǒng)計、安全控制、異常處理等。

010動態(tài)代理與靜態(tài)代理模式的區(qū)別?

011JDK動態(tài)代理的實現(xiàn)步驟?

1.創(chuàng)建接口,定義目標(biāo)類需要完成的功能
2.創(chuàng)建目標(biāo)類,實現(xiàn)接口。
3.創(chuàng)建InvocationHandler接口的實現(xiàn)類。在invoke方法中完成代理類的功能。
      目標(biāo)方法的調(diào)用
      功能增強
4.使用Proxy類中靜態(tài)方法Proxy.newProxyInstance完成代理類對象的創(chuàng)建,返回代理對象,并把返回值轉(zhuǎn)為接口類型。

public class JDKDynamicProxy {
    public static void main(String[] args) {
        CAProxy caProxy = new CAProxy();
        IA instance = (IA) caProxy.getInstance(new CA());
        instance.say();
        instance.fly();
    }
}
interface IA{
    void say();
    void fly();
}
class CA implements IA{
    @Override
    public void say() {
        System.out.println("I am class CA");
    }
    @Override
    public void fly() {
        System.out.println("I can fly");
    }
}
class CAProxy implements InvocationHandler{
    private Object target;
    public Object getInstance(Object object){
        this.target = object;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("I am proxy!");
        Object result = method.invoke(target, args);
        return result;
    }
}

012CGLib代理的實現(xiàn)步驟?

public class CglibDynamicProxy {
    public static void main(String[] args) {
        CglibProxy cglibProxy = new CglibProxy();
        A a = (A) cglibProxy.getInstance(new A());
        a.say();
    }
}
class A {
    public void say(){
        System.out.println("I am A");
    }
}
class CglibProxy implements MethodInterceptor{

    private Object target;
    public Object getInstance(Object object){
        this.target = object;
        Enhancer enhancer = new Enhancer();
        // 設(shè)置父類為實例類
        enhancer.setSuperclass(this.target.getClass());
        // 回調(diào)方法
        enhancer.setCallback(this);
        // 創(chuàng)建代理對象
        return enhancer.create();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("I am cglib proxy!");
        Object result = method.invoke(target, objects);
        return result;
    }
}

目錄

返回頂部
主站蜘蛛池模板: 夜夜躁日日躁狠狠 | 久草视频在线资源 | 日韩黄色片 | 99视频全部免费 | 欧美激情久久久久久久大片 | 久久91精品国产一区二区 | 国产自精品在线 | 国产成人啪一区二区 | 亚洲国产另类久久久精品小说 | 在线视频这里只有精品 | 天天拍夜夜添久久精品免费 | 兽皇在线观看 | 四虎官网 | 国产欧美网站 | 美女视频黄是免费的 | 天天操天天插天天干 | 欧美二区三区 | 中文字幕在线视频一区 | 四虎com| 国内精品视频成人一区二区 | 高清影院|精品秒播3 | 国产乱人伦av在线a 国产乱人伦精品一区二区 国产乱人伦偷精品视频不卡 | 四虎永久免费地址在线观看 | 欧美综合图区亚欧综合图区 | 站长推荐国产午夜免费视频 | 91热精品 | 老司机久久精品视频 | 玖玖色在线 | 天天综合天天综合色在线 | b毛片| 全免费a级毛片免费看视频免 | 九九视频免费看 | 国产精品高清在线观看93 | 91不卡在线精品国产 | 亚洲丶国产丶欧美一区二区三区 | 国产在线看不卡一区二区 | 色玖玖| 国产区综合 | 欧美激情一区 | 国产一级毛片视频 | 亚洲国产精品婷婷久久 |