静态代理:
(1):通过实现接口
-
How?
创建一个接口:
public interface User { void havelook(); }
创建一个客户作为目标对象及受代理对象实现User
package com.mapper; public class RealUser implements User { @Override public void havelook() { System.out.println("去看北京二环的房子"); } }
创建一个”中介”实现User并且对其加强
package com.mapper; public class HousePoxy implements User { private User target; public HousePoxy(User target) { this.target = target; } @Override public void havelook() { beforelook(); target.havelook(); afterlook(); } private void beforelook(){ System.out.println("找房源"); System.out.println("根据客户需求推荐合适的房子"); System.out.println("联系房东"); } private void afterlook(){ System.out.println("收中介费"); System.out.println("跟踪调查"); } }
创建测试类 通过中介实现目标的需求
public class Test { public static void main(String[] args) { HousePoxy housePoxy = new HousePoxy(new RealUser()); housePoxy.havelook(); } }
(2):通过继承实现
-
HOW?
public class HousePoxy extends RealUser { @Override public void havelook() { beforelook(); super.havelook(); afterlook(); } private void beforelook(){ System.out.println("找房源"); System.out.println("根据客户需求推荐合适的房子"); System.out.println("联系房东"); } private void afterlook(){ System.out.println("收中介费"); System.out.println("跟踪调查"); } }
创建一个受代理的对象
public class RealUser implements User { @Override public void havelook() { System.out.println("去看北京二环的房子"); } }
创建一个代理对象继承RealUser 并且对他进行加强
创建一个test测试:
public class Test { public static void main(String[] args) { HousePoxy housePoxy = new HousePoxy(); housePoxy.havelook(); } }
动态代理:
从JDK 1.3版本开始引入 是面向接口的代理实现 要求被代理的目标对象必须通过抽象主题接口进行定义 核心API java.lang.reflect.InvocationHandler接口 代理方法的调用处理程序,负责为代理方法提供业务逻辑 包含方法:Object invoke(Object proxy, Method method, Object[] args) java.lang.reflect.Proxy类 负责动态创建代理类及其实例 主要方法:static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
和静态不同:
- 动态的代理对象是动态生成的
一个控制器:
public class Haddler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
/**
* 控制器用来执行程序业务逻辑
* 代理方法的调用处理程序,负责为代理方法提供业务逻辑
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beforelook();
method.invoke(target,args);
afterlook();
return null;
}
private void beforelook(){
System.out.println("找房源");
System.out.println("根据客户需求推荐合适的房子");
System.out.println("联系房东");
}
private void afterlook(){
System.out.println("收中介费");
System.out.println("跟踪调查");
}
}
创建代理对象
/**
* 创建代理对象
*/
public class Usepoxy {
public static <T>T create(Object target){
Haddler haddler = new Haddler();
haddler.setTarget(target);
/**
* 受代理对象的类加载器
* 代理对象的类的接口
* 执行控制代理对象的控制器
*/
Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), haddler);
return (T)o;
}
}
Test
public class Tesy {
public static void main(String[] args) {
User o = Usepoxy.create(new RealUser());
o.havelook();
}
}