在Java中,代理模式是一种常用的设计模式,它允许一个对象(代理对象)控制对另一个对象(目标对象)的访问。代理模式主要分为三种:静态代理、动态代理和CGLIB代理(基于类的代理)。这里,我们将重点讨论动态代理。
动态代理是在运行时动态地创建代理类及其对象,而不需要预先定义代理类。在Java中,动态代理主要基于Java的反射机制,并且需要实现InvocationHandler接口。
package com.proxy;
/**
* description 动态代理测试类
*
*/
public class DynamicProxyTest {
public static void main(String[] args) {
ClothesFactory clothesFactory = new ClothesFactory();
ShoesFactory shootFactory = new ShoesFactory();
PurchasingCompany company = new PurchasingCompany();
company.setFactory(shootFactory);
Shoes employee1 = (Shoes) company.getProxyInstance();
employee1.shoes("42");
company.setFactory(clothesFactory);
Clothes employee2 = (Clothes) company.getProxyInstance();
employee2.clothes(180);
}
}
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* description 代购公司(动态代理对象)
*
*/
public class PurchasingCompany implements InvocationHandler {
/**
* 目标对象
**/
private Object factory ;
public Object getFactory() {
return factory;
}
public void setFactory(Object factory) {
this.factory = factory;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
frontService();
/**
* 这里用了反射的思想,因为我们不知道调用的是那个工厂的那个方法
**/
Object retObject = method.invoke(factory, args);
endService();
return null;
}
public void frontService() {
System.out.println("根据您的需求进行市场调研");
}
public void endService() {
System.out.println("为您提供一条龙的包办服务");
}
/**
* 调度员工
*
* 1 新建一名员工
* 2.告诉员工工厂地址
* this:绑定
*/
public Object getProxyInstance() {
return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
}
}