实现步骤:
1.创建一个接口,定义卖u盘的方法,表示你的厂家和商家做的事情。
2.创建厂家类,实现1步骤的接口
3.创建商家,就是代理,也需要实现1步骤中的接口。
4.创建客户端类,调用商家的方法买一个u盘。
接口
package com.su;
public interface UsbSell {
//定义方法 参数amount表示购买的数量,
float sell(int amounnt);
}
目标类
package com.su;
//目标类:金士顿厂家,不接受用户的单独购买
public class UsbKingFactory implements UsbSell{
@Override
public float sell(int amounnt) {
//一个128G的U盘是85元,后期根据数量调整价格
return 85.0f;
}
}
代理类
package com.su;
//taobao是一个商家,代理金士顿u盘的销售
public class TaoBao implements UsbSell{
//声明商家代理的厂家具体是谁
private UsbKingFactory factory = new UsbKingFactory();
@Override
public float sell(int amounnt) {
//向厂家发送订单,告诉商家,我买了u盘,厂家发货
float price = factory.sell(amounnt);//厂家的价格
price = price + 25;//代理类完成目标类方法调用后,增强了功能
return price;
}
}
代理类:
有一个属性是目标类
目标类中方法的调用
功能增强
客户端类
package com.su;
public class ShopMain {
public static void main(String[] args) {
TaoBao taoBao = new TaoBao();
float price = taoBao.sell(1);
System.out.println("通过淘宝的商家,购买u盘的单价:"+price);
}
}
缺点:一个目标类就要对应一个代理类。
动态代理
接口
package com.su;
public interface UserDao {
int add(int a,int b);
String update(String id);
}
被代理的类
package com.su;
public class UserDaoimpl implements UserDao{
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String update(String id) {
return id;
}
}
调用请求处理器
package com.su;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;
class UserDaoProxy implements InvocationHandler {
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法之前执行...."+method.getName()+" 传递的参数..."+ Arrays.toString(args));
Object res = method.invoke(obj, args);
System.out.println("方法之后执行..."+obj);
return res;
}
}
测试
package com.su;
import java.lang.reflect.Proxy;
public class JDKProxy {
public static void main(String[] args) {
//创建被代理的对象,UserDao接口的实现类
UserDaoimpl userDaoimpl = new UserDaoimpl();
//获取被代理对象的ClassLoader
ClassLoader classLoader = userDaoimpl.getClass().getClassLoader();
//获取被代理对象实现的接口的Class集合
Class<?>[] interfaces = userDaoimpl.getClass().getInterfaces();
//创建一个将传给代理类的调用请求处理器,处理所有的代理对象上的方法调用
UserDaoProxy userDaoProxy = new UserDaoProxy(userDaoimpl);
//创建代理对象
UserDao proxy = (UserDao) Proxy.newProxyInstance(classLoader,interfaces,userDaoProxy);
//调用方法
int temp = proxy.add(2, 3);
System.out.println(temp);
String str = proxy.update("hello,world!");
System.out.println(str);
}
}