代理Proxy:
代理模式是常见的设计模式之一。解决直接访问对象时带来的问题。
举例(大话设计模式中的例子),你喜欢班里的女生小芳,于是你写了一封情书要送给她。但是你又不好意思直接给他。于是你叫你同班的好朋友“代理”帮你把情书送给她。达到你的目的的同时减少不必要的尴尬。
代理模式又分为两种。静态代理模式和动态代理模式。
静态代理模式
public class Proxy {
public static void main(String[] args) {
YouSelf youSelf = new YouSelf();
youSelf.gaobai(); //你自己完成告白的操作
System.out.println("----------------------------");
Daili daili = new Daili(youSelf);//代理帮你完成告白的操作
daili.gaobai();
}
}
//告白小芳的接口
interface Gaobai{
void gaobai();
}
class YouSelf implements Gaobai{
@Override
public void gaobai() {
System.out.println("情书给到了小芳");
}
}
class Daili implements Gaobai{
private Gaobai gaobai;
public Daili(Gaobai gaobai){
this.gaobai=gaobai;
}
@Override
public void gaobai() {
gaobai.gaobai();
System.out.println("避免尴尬");
}
}
动态代理
动态代理:在程序执行过程中,通过反射得到的代理对象。
public interface UserDao {
void add();
void delete();
void update();
void select();
}
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("增加");
}
@Override
public void delete() {
System.out.println("删除");
}
@Override
public void update() {
System.out.println("修改");
}
@Override
public void select() {
System.out.println("查询");
}
}
public class UserDaoImpl2 implements UserDao {
@Override
public void add() {
System.out.println("检验");
System.out.println("增加");
System.out.println("产生日志");
}
@Override
public void delete() {
System.out.println("检验");
System.out.println("删除");
System.out.println("产生日志");
}
@Override
public void update() {
System.out.println("检验");
System.out.println("修改");
System.out.println("产生日志");
}
@Override
public void select() {
System.out.println("检验");
System.out.println("查询");
System.out.println("产生日志");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocation implements InvocationHandler {
private Object target;
public MyInvocation(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 ProxyDemo {
public static void main(String[] args) {
UserDaoImpl ud = new UserDaoImpl();
ud.add();
ud.delete();
ud.select();
ud.update();
System.out.println("---------------");
UserDaoImpl2 ud2 = new UserDaoImpl2();
ud2.add();
ud2.delete();
ud2.select();
ud2.update();
System.out.println("---------------");
MyInvocation handler = new MyInvocation(ud) ;
// public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
UserDao proxyInstance = (UserDao) Proxy.newProxyInstance(
ud.getClass().getClassLoader(),
ud.getClass().getInterfaces(),
handler);
proxyInstance.add();
proxyInstance.update();
proxyInstance.select();
proxyInstance.delete();
}
}