【GOF23設計模式】_代理模式_靜態代理_動態代理_開發場景JAVA236-237

來源:http://www.bjsxt.com/
一、S03E236_01【GOF23設計模式】_代理模式、靜態代理

代理模式

核心角色

應用場景

靜態代理

package com.test.proxy.staticProxy;

public interface Star {
    /**
     * 面談
     */
    void confer();
    /**
     * 籤合同
     */
    void signConstract();
    /**
     * 訂票
     */
    void bookTicket();
    /**
     * 唱歌
     */
    void sing();
    /**
     * 收錢
     */
    void collectMoney();
}
package com.test.proxy.staticProxy;

public class RealStar implements Star{

    @Override
    public void confer() {
        System.out.println("RealStar.confer()");
    }

    @Override
    public void signConstract() {
        System.out.println("RealStar.signConstract()");
    }

    @Override
    public void bookTicket() {
        System.out.println("RealStar.bookTicket()");
    }

    @Override
    public void sing() {
        System.out.println("RealStar(歌手本人).sing()");
    }

    @Override
    public void collectMoney() {
        System.out.println("RealStar.collectMoney()");
    }
}
package com.test.proxy.staticProxy;

public class ProxyStar implements Star{
    private Star realStar; 


    public ProxyStar(Star realStar) {
        super();
        this.realStar = realStar;
    }

    @Override
    public void confer() {
        System.out.println("ProxyStar.confer()");
    }

    @Override
    public void signConstract() {
        System.out.println("ProxyStar.signConstract()");
    }

    @Override
    public void bookTicket() {
        System.out.println("ProxyStar.bookTicket()");
    }

    @Override
    public void sing() {
        realStar.sing();
    }

    @Override
    public void collectMoney() {
        System.out.println("ProxyStar.collectMoney()");     
    }
}
package com.test.proxy.staticProxy;

public class Client {
    public static void main(String[] args) {
        Star realStar = new RealStar();
        Star proxyStar = new ProxyStar(realStar);

        proxyStar.confer();
        proxyStar.signConstract();
        proxyStar.bookTicket();
        proxyStar.sing();
        proxyStar.collectMoney();
    }
}
控制檯輸出:
ProxyStar.confer()
ProxyStar.signConstract()
ProxyStar.bookTicket()
RealStar(歌手本人).sing()
ProxyStar.collectMoney()

UML

二、S03E237_01【GOF23設計模式】_代理模式、動態代理、開發中常見的場景

動態代理(動態生成代理類)
——JDK自帶的動態代理
——javaassist字節碼操作庫實現
——CGLIB
——ASM(底層使用指令,可維護性較差)

動態代理相比於靜態代理的優點
——抽象角色中(接口)聲明的所有方法都被轉移到調用處理器中一個集中的方法中處理,這樣我們可以更加靈活和統一地處理衆多的方法。
JDK自帶的動態代理
——java.lang.reflect.Proxy
————作用:動態生成代理類和對象
——java.lang.reflect.InvocationHandler(處理器接口)
————可以通過invoke方法實現對真實角色的代理訪問
————每次通過Proxy生成代理類對象時都要指定對應的處理器對象

Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.sing();
package com.test.proxy.dynamicProxy;

public interface Star {
    /**
     * 面談
     */
    void confer();
    /**
     * 籤合同
     */
    void signConstract();
    /**
     * 訂票
     */
    void bookTicket();
    /**
     * 唱歌
     */
    void sing();
    /**
     * 收錢
     */
    void collectMoney();
}
package com.test.proxy.dynamicProxy;

public class RealStar implements Star{

    @Override
    public void confer() {
        System.out.println("RealStar.confer()");
    }

    @Override
    public void signConstract() {
        System.out.println("RealStar.signConstract()");
    }

    @Override
    public void bookTicket() {
        System.out.println("RealStar.bookTicket()");
    }

    @Override
    public void sing() {
        System.out.println("RealStar(歌手本人).sing()");
    }

    @Override
    public void collectMoney() {
        System.out.println("RealStar.collectMoney()");
    }
}
package com.test.proxy.dynamicProxy;

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

public class StarHandler implements InvocationHandler{
    private Star realStar;

    public StarHandler(Star realStar) {
        super();
        this.realStar = realStar;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {

        Object object = null;

        System.out.println("真正的方法執行前");
        System.out.println("面談,籤合同,預付款,訂機票");

        if(method.getName().equals("sing")){
            object = method.invoke(realStar, args);
        }

        System.out.println("真正的方法執行後");
        System.out.println("收尾款");

        return object;
    }
}
package com.test.proxy.dynamicProxy;

import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        Star realStar = new RealStar();
        StarHandler handler = new StarHandler(realStar);

        Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);

        proxy.sing();
    }
}
控制檯輸出:
真正的方法執行前
面談,籤合同,預付款,訂機票
RealStar(歌手本人).sing()
真正的方法執行後
收尾款
發佈了4 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章