在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
举个例子:你要买车,钱是你出。但是你出钱还得去4s店,还得上牌才能开回家,那么来个兔子(代劳的第三方),他帮你跑4s店,帮你去上牌,你出钱就行。你也省事了。只不过你要多出钱。这个兔子就是你的代理对象。
public interface BuyCar {
void buyCar();
}
/**
* 接口实现类
*/
public class BuyCarImpl implements BuyCar{
@Override
public void buyCar() {
System.out.println("买一辆宝马");
}
}
/**
* 代理对象
*/
public class BuyCarProxy implements BuyCar {
private BuyCar buyCar;
public BuyCarProxy(BuyCar buyCar) {
this.buyCar = buyCar;
}
@Override
public void buyCar() {
System.out.println("去武汉白沙洲大市场");//前置操作
buyCar.buyCar();
System.out.println("上牌开回家");//后置操作
}
}
public class ProxyDemo {
public static void main(String[] args) {
/**
* 创建型模式 - 代理模式(静态代理 ,动态代理)
*/
/**
* 静态代理
* 1.有公共的接口方法
* 2.有具体的对应的实现类 BuyCarImpl
* 3.有代理类(针对接口的实现 有对象针对性) 代理类里要注入对应的实现类 实现类做事 代理类也做事
*/
BuyCar buyCar = new BuyCarImpl();
BuyCarProxy buyCarProxy = new BuyCarProxy(buyCar);
buyCarProxy.buyCar();
/**
* 动态代理 (JDK自带)
* 1.有公共的接口方法
* 2.有具体的对应的实现类 BuyCarImpl
* 3.动态处理器(针对所有需要代理的对象) 添加一些需要代理的对象的公共操作
*/
BuyCar dynamicBuyCar = new BuyCarImpl();
//Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
//代理对象是 对应接口的实现类
Object o = Proxy.newProxyInstance(DynamicProxyHandler.class.getClassLoader(), new Class[]{BuyCar.class}, new DynamicProxyHandler(dynamicBuyCar));
((BuyCar) o).buyCar();
}
}
package com.wangguo.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler {
/**
* 被代理对象
*/
private Object object;
public DynamicProxyHandler(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("去武汉白沙洲大市场");//前置操作
//被代理对象处理
Object invoke = method.invoke(object, args);
System.out.println("上牌开回家");//后置操作
return invoke;
}
}