1. 程式人生 > >Java基礎總結之設計模式(五)

Java基礎總結之設計模式(五)

動態代理:本來應該自己做的事情卻請了別人來做,被請的人就是代理物件。所謂動態代理就是在程式執行過程中產生的這個物件。動態代理通過反射實現。在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...
返回代理物件

上面就是動態代理的實現過程。那麼為什麼要使用動態代理呢?開閉原則:對修改關閉,對擴充套件開放。很多時候我們需要對一個類的功能做一些擴充套件,這個時候我們不是去修改原來的類,而是生成一個代理物件,對你需要的擴充套件功能進行新增等。


注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。