代理模式就是新增長一個代理類,而後經過代理類來調用咱們的實現。java
應用場景能夠參考中介。ide
未使用代理類,即接口直接經過實現類實現功能工具
接口:性能
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(); } }
即新增一個代理類,來管理咱們的實現類,咱們能夠在代理類中添加一些動做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(); } }
結果以下
能夠看見,咱們的靜態代理類也實現了UserDao接口,當接口新增內容時,如新增一個query()方法,此時,咱們的UserDaoImpl和StaticProxy類都要改變。
這是咱們不想看見的,咱們但願代理類能夠不作修改,只須要修改咱們的實現類的內容。由此引出了動態代理類(由此動態代理類的做用也顯而易見)
定義動態代理工具類
返回指定的接口,將方法調用指定的調用處理程序的代理類的一個實例
三個參數能夠查閱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表達式,
輸出結果
代理模式強調一些通用功能的擴展,在方法執行前,執行後添加點什麼東西(LOG),靜態即單一的擴展,動態爲多個類擴展,可是都引入新的代理類,從性能上講,新的代理類會致使性能有所降低