小A:“代理模式都有些什么角色?”
大B:“1、抽象角色(秘书-局长):声明真实对象和代理对象的共同接口(秘书-局。2、代理角色(秘书):代理对象角色(秘书)内部含有对真实对象(局长)的引用,从而可以操作真实对象(局长),同时代理对象(秘书)提供与真实对象(局长)相同的接口(秘书-局长)以便在任何时刻都能代替真实对象(局长)。同时,代理对象(秘书)可以在执行真实对象(局长)操作时,附加其他的操作,相当于对真实对象(局长)进行封装。3、真实角色(局长):代理角色(秘书)所代表的真实对象(局长),是我们最终要引用的对象(局长)。”
按功能将代理的组成类分为:标的类、标的接口、拦截类、耦合类
基于接口的创建代理
要求被代理对象必须实现一个接口
- 抽象角色:IProducer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public interface IProducer {
public void saleProduct(float money);
public void afterService(float money); }
|
- 局长 Producer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
public class Producer implements IProducer{
public void saleProduct(float money){ System.out.println("销售产品,并拿到钱:"+money); }
public void afterService(float money){ System.out.println("提供售后服务,并拿到钱:"+money); } }
|
- 客户调用秘书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) { final Producer producer = new Producer();
IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() {
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnValue = null;
Float money = (Float)args[0]; if("saleProduct".equals(method.getName())) { returnValue = method.invoke(producer, money*0.8f); } return returnValue; } }); proxyProducer.saleProduct(10000f); } }
|
基于类的动态代理
** 需要添加依赖cglib,被代理类要求未被fianl修饰**
1 2 3 4 5
| <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>
|
- 局长
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
public class Producer {
public void saleProduct(float money){ System.out.println("销售产品,并拿到钱:"+money); }
public void afterService(float money){ System.out.println("提供售后服务,并拿到钱:"+money); } }
|
- 客户调用秘书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class Client {
public static void main(String[] args) { final Producer producer = new Producer();
Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {
@Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object returnValue = null;
Float money = (Float)args[0]; if("saleProduct".equals(method.getName())) { returnValue = method.invoke(producer, money*0.8f); } return returnValue; } }); cglibProducer.saleProduct(12000f); } }
|