1、什么叫代理模式;
代理模式这种设计模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。代理对象代为执行目标对象的方法,并在此基础上进行相应的扩展。看起来是有点拗口,首先介绍一个原则:开闭原则(对扩展开放,对修改关闭)。一种好的设计模式甚至是架构,都是在不修改原有形态的基础上扩展出新的功能。
代理模式的元素是:共同接口、代理对象、目标对象。
代理模式的行为:由代理对象执行目标对象的方法、由代理对象扩展目标对象的方法。
代理模式的宏观特性:对客户端只暴露出接口,不暴露它以下的架构。
代理模式的微观特性:每个元由三个类构成。
代理模式的种类:静态代理、动态代理(jdk动态代理、cglib动态代理、Spring和AspectJ实现的动态代理)
2、静态代理;
interface Network { // 定义Network接口
public void browse(); // 定义浏览的抽象方法
}
class Real implements Network { // 真实的上网操作
public void browse() { // 覆写抽象方法
System.out.println("上网浏览信息!");
}
}
class Proxy implements Network { // 代理上网
private Network network;
public Proxy(Network network) {// 设置代理的真实操作
this.network = network; // 设置代理的子类
}
public void check() { // 身份验证操作
System.out.println("检查用户是否合法!");
}
public void browse() {
this.check(); // 调用具体的代理业务操作
this.network.browse(); // 调用真实的上网操作
}
}
public class ProxyDemo {
public static void main(String args[]) {
Network net = null; // 定义接口对象
net = new Proxy(new Real()); // 实例化代理,同时传入代理的真实操作
net.browse(); // 调用代理的上网操作
}
}
3、动态代理,分为jdk动态代理、cglib动态代理
接口
public interface DAOInterface {
public void add();
public void delete();
public void update();
public void query();
}
默认实现
public class UserDao implements DAOInterface {
@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 query() {
System.out.println("在目标对象中执行query");
}
}
jdk动态代理
public class ProxyTest {
public static void main(String[] args){
final DAOInterface userDao = new UserDao();
DAOInterface proxy = (DAOInterface) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces()
, new InvocationHandler() {
//回调方法 拦截到目标对象的时候执行
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("在 代理对象 中拦截到:"+method.getName());
Object o = method.invoke(userDao, args);//调用拦截到的方法
return o;
}
});
proxy.delete();
}
}
Cglib动态代理
public class CglibTest {
public static void main(String[] args){
final UserDao target = new UserDao();
Enhancer en = new Enhancer();
//设置代理对象的父类
en.setSuperclass(target.getClass());
//设置回调
en.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("在 代理对象 中拦截到 "+arg1.getName());
Object obj = arg1.invoke(target, arg2);
return obj;
}
});
UserDao proxy = (UserDao) en.create();
proxy.add();
}
}