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

代理模式

代理就相當(dāng)于 中介 買房子的找中介 買房子的找中介 買房子的賣房子的不直接接觸,中介可以在代理中添加自己的服務(wù)

靜態(tài)代理

就是代理類中的 代理對(duì)象是明確的類
缺點(diǎn):一個(gè)代理對(duì)象 一個(gè)代理類
優(yōu)點(diǎn):速度比動(dòng)態(tài)代理快

接口

public interface FoodFactory {
    void payFood(int  count);
}

接口實(shí)現(xiàn)

public class ImplFood implements FoodFactory {
    @Override
    public void payFood(int count) {
        System.out.println("購買了"+count+"份食物");
    }
}

靜態(tài)代理

public class StaticProxy {
    private FoodFactory foodFactory;

    public FoodFactory getFoodFactory() {
        return foodFactory;
    }

    public void setFoodFactory(FoodFactory foodFactory) {
        this.foodFactory = foodFactory;
    }
    //方法增強(qiáng)
    public void payFoods(int count){
        before();
        foodFactory.payFood(count);
        after();
    }

    private void before(){
        System.out.println("您好!");
    }
    private void after(){
        System.out.println("再見歡迎再來!");
    }
}

運(yùn)行

  public static void main(String[] args) {
        ImplFood food = new ImplFood();
        StaticProxy proxy = new StaticProxy();
        proxy.setFoodFactory(food);
        proxy.payFoods(10);
    }

結(jié)果

您好!
購買了10份食物
再見歡迎再來!

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

就是代理類中 的代理對(duì)象 是未知的,需要通過調(diào)用時(shí)指定類,需要Java反射
缺點(diǎn):需要反射 性能略有影響
優(yōu)點(diǎn):一個(gè)動(dòng)態(tài)代理類 可以解決多個(gè)靜態(tài)代理的問題,避免重復(fù)

動(dòng)態(tài)代理類 要實(shí)現(xiàn)InvocationHandler

public class DynamicProxy implements InvocationHandler {

    private Object obj;

    public Object getProxy(Object obj){
        this.obj = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法增強(qiáng)
        before();
        Object o = method.invoke(obj,args);
        after();
        return o;
    }

    private void before(){
        System.out.println("您好!");
    }
    private void after(){
        System.out.println("再見歡迎再來!");
    }
}

運(yùn)行

 public static void main(String[] args) {

        DynamicProxy proxy = new DynamicProxy();

        FoodFactory df = (FoodFactory) proxy.getProxy(new ImplFood());
        df.payFood(10);

        GoodsFactory dg = (GoodsFactory) proxy.getProxy(new ImplGoods());
        dg.payGoods("小明");
        dg.payGoodsCount(5);
    }

結(jié)果

您好!
購買了10份食物
再見歡迎再來!
您好!
小明購買了商品
再見歡迎再來!
您好!
5件商品
再見歡迎再來!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容