代理模式,代理模式java

來源:互聯網
上載者:User

代理模式,代理模式java

1、靜態代理

  1.1靜態代理的代理類和和被代理的類都要維護一個共同的介面。

public interface IUserDao {    void save();}

  1.2被代理的類,目標對象

public class UserDao implements IUserDao{    @Override    public void save() {        System.out.println("-----已經儲存資料!!!------");    }}

  1.3代理對象

public class UserDaoProxy implements IUserDao{    // 接收儲存目標對象    private IUserDao target;    public UserDaoProxy(IUserDao target) {        this.target = target;    }    @Override    public void save() {        System.out.println("開始事務...");        target.save();             // 執行目標對象的方法        System.out.println("提交事務...");    }}

  1.4測試類別

public class App {    public static void main(String[] args) {        // 目標對象        IUserDao target = new UserDao();        // 代理        IUserDao proxy = new UserDaoProxy(target);        proxy.save();  // 執行的是,代理的方法    }}

 

2、動態代理

  2.1同樣的,動態代理也需要完成一個介面。(同上)

  2.2目標對象也是相同的。

  2.3隻是在代理對象上有所不同

public class ProxyFactory {    // 維護一個目標對象    private Object target;    public ProxyFactory(Object target){        this.target = target;    }    // 給目標對象,組建代理程式對象      public Object getProxyInstance() {        return Proxy.newProxyInstance(                target.getClass().getClassLoader(),                 target.getClass().getInterfaces(),                new InvocationHandler() {                    @Override                    public Object invoke(Object proxy, Method method, Object[] args)                            throws Throwable {                        System.out.println("開啟事務");                        // 執行目標對象方法                        Object returnValue = method.invoke(target, args);                            System.out.println("提交事務");                        return returnValue;                    }                });    }}

  2.4測試類別

public class App {    public static void main(String[] args) {        // 目標對象        IUserDao target = new UserDao();        System.out.println(target.getClass());        // 給目標對象,建立代理對象        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();        System.out.println(proxy.getClass());        // 執行方法   【代理對象】        proxy.save();    }}

 

3、cglib代理

  3.1cglib代理不需要完成介面,只需要寫被代理的類和代理類即可,此處被代理類同1.2,所以不再編寫。

  3.2代理類有所不同,用到cglib代理模式需要引用spring的核心架構套件。

public class ProxyFactory implements MethodInterceptor{    // 維護目標對象    private Object target;    public ProxyFactory(Object target){        this.target = target;    }    // 給目標對象建立代理對象    public Object getProxyInstance(){        //1. 工具類        Enhancer en = new Enhancer();        //2. 設定父類        en.setSuperclass(target.getClass());        //3. 設定回呼函數        en.setCallback(this);        //4. 建立子類(代理對象)        return en.create();    }    @Override    public Object intercept(Object obj, Method method, Object[] args,            MethodProxy proxy) throws Throwable {        System.out.println("開始事務.....");        // 執行目標對象的方法        Object returnValue = method.invoke(target, args);        System.out.println("提交事務.....");        return returnValue;    }}

  3.3測試類別

public class App {    public static void main(String[] args) {        // 目標對象        UserDao target = new UserDao();        System.out.println(target.getClass());        // 代理對象        UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();        System.out.println(proxy.getClass());        // 執行代理對象的方法        proxy.save();    }}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.