代理模式

代理模式就是新增長一個代理類,而後經過代理類來調用咱們的實現。java

應用場景能夠參考中介。ide

1.未使用代理類場景

        未使用代理類,即接口直接經過實現類實現功能工具

接口:性能

public interface UserDao {
    public void updateUser();
    public void delUser();
}

實現類:測試

public class UserDaoImpl implements UserDao{
    @Override
    public void updateUser() {
        System.out.println("更新用戶成功");
    }

    @Override
    public void delUser() {
        System.out.println("刪除用戶成功");
    }
}

測試類:this

public class Test {
    public static void main(String[] args) {
        UserDao userDao=new UserDaoImpl();
        userDao.delUser();
        userDao.updateUser();
    }
}

2.使用代理類

2.1靜態代理類

即新增一個代理類,來管理咱們的實現類,咱們能夠在代理類中添加一些動做spa

將具體的實現經過構造器注入,而後代理類中調用咱們對應的實現類的方法,代理

新增的代理類以下:code

public class StaticProxy implements UserDao{
    private UserDao userDao;
    public StaticProxy(UserDao userDao1)
    {
        this.userDao=userDao1;
    }


    @Override
    public void updateUser() {
        System.out.println("begin");
        userDao.updateUser();
        System.out.println("end ");
    }

    @Override
    public void delUser() {
        System.out.println("begin");
        userDao.delUser();
        System.out.println("end");
    }
}

測試類blog

public class ProxyTest {
    public static void main(String[] args) {
        UserDao userDaoProxy=new StaticProxy(new UserDaoImpl());
        userDaoProxy.delUser();
        userDaoProxy.updateUser();
    }
}

結果以下

2.2由靜態代理類引出動態代理類

        能夠看見,咱們的靜態代理類也實現了UserDao接口,當接口新增內容時,如新增一個query()方法,此時,咱們的UserDaoImpl和StaticProxy類都要改變。

        這是咱們不想看見的,咱們但願代理類能夠不作修改,只須要修改咱們的實現類的內容。由此引出了動態代理類(由此動態代理類的做用也顯而易見)

2.3動態代理類

定義動態代理工具類

返回指定的接口,將方法調用指定的調用處理程序的代理類的一個實例

三個參數能夠查閱JDK明細,主要須要實現InvocationHandler接口,實現invoke方法,經過反射實現對抽象接口方法的調用method.invoke(target, args),調其中target就是咱們真正的實現類

-------------------------------------

public class DynamicProxy {
    public static void main(String[] args) {
        UserDao userDao = (UserDao) Proxy.newProxyInstance(
                UserDao.class.getClassLoader(),
                new Class[]{UserDao.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("proxy begin");
                        Object result = method.invoke(new UserDaoImpl(), args);
                        System.out.println("proxy end");
                        return result;
                    }
                }
        );
        userDao.delUser();
    }

兩種寫法都同樣,上一種爲lambda表達式,

輸出結果

3.總結

代理模式強調一些通用功能的擴展,在方法執行前,執行後添加點什麼東西(LOG),靜態即單一的擴展,動態爲多個類擴展,可是都引入新的代理類,從性能上講,新的代理類會致使性能有所降低

相關文章
相關標籤/搜索