Java基礎總結之設計模式(五)
阿新 • • 發佈:2018-11-09
動態代理:本來應該自己做的事情卻請了別人來做,被請的人就是代理物件。所謂動態代理就是在程式執行過程中產生的這個物件。動態代理通過反射實現。在Java中的java.lang.reflect包下提供了一個Proxy類和一個InvocationHandler介面,通過使用這個類和介面就可以生成動態代理物件。注意JDK提供的代理只能針對介面做代理。
public interface StudentDao { public abstract void add(); public abstract void delete(); public abstract void update(); public abstract void find(); }
public class StudentDaoImpl implements StudentDao { @Override public void add() { System.out.println("add..."); } @Override public void delete() { System.out.println("delete..."); } @Override public void update() { System.out.println("update..."); } @Override public void find() { System.out.println("find..."); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("許可權校驗"); Object obj=method.invoke(target, args); System.out.println("返回代理物件"); return obj; } }
import java.lang.reflect.Proxy;
public class StudentTest {
public static void main(String[] args) {
StudentDao s = new StudentDaoImpl();
s.add();
s.delete();
s.update();
s.find();
System.out.println("---------------");
MyInvocationHandler handler = new MyInvocationHandler(s);
StudentDao proxys = (StudentDao) Proxy.newProxyInstance(s.getClass().getClassLoader(),
s.getClass().getInterfaces(), handler);
proxys.add();
proxys.delete();
proxys.update();
proxys.find();
}
}
add...
delete...
update...
find...
---------------
許可權校驗
add...
返回代理物件
許可權校驗
delete...
返回代理物件
許可權校驗
update...
返回代理物件
許可權校驗
find...
返回代理物件
上面就是動態代理的實現過程。那麼為什麼要使用動態代理呢?開閉原則:對修改關閉,對擴充套件開放。很多時候我們需要對一個類的功能做一些擴充套件,這個時候我們不是去修改原來的類,而是生成一個代理物件,對你需要的擴充套件功能進行新增等。
注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。