关联文章:
白话动态代理:
假设有一个service类,可以完成根据客户发送的商品请求,然后service类可以根据商品,返回一个价格给客户。与此同时,还有很多的其他业务也在用这个类。
现在公司来了个新的需求,要给这个类添加打折,现金抵扣的活动,由于其他业务也存在以来于service类,所以我们不能通过修改这个service类,来满足公司的需求 。这个时候我们就要用到动态代理,写一个动态代理的类,去实现原有的服务方法之外,在方法调用之前或者之后,都可以加入一些新业务的逻辑,这样可以很好的满足公司的需求。
Demo:
业务原接口:
public interface IBoss{
int yifu(String size);
}
原业务实现类:
public class Boss implements IBoss{
public yifu(String size){
System.err.println("天猫小强旗舰店,老板给客户发快递----衣服型号:"+size);
//这件衣服的价钱,从数据库读取
return 50;
}
public void kuzi(){
System.err.println("天猫小强旗舰店,老板给客户发快递----裤子");
}
}
原业务调用:
public class saleAction{
@Test
void saleByBossSelf() throws Exception{
IBoss boss = new Boss();
System.out.println("老板自营!");
Int money = boss.yifu(“xxl”);
System.out.println("衣服成交价:" + money);
}
}
代理类:
public static <T> T getProxyBoss(final Class<?> interfaceClass, final Class<?> implementsClass, int discount) throws Exception {
return (T) Proxy.newInstance(
interfaceClass.getClassLoader(),
new Class[]{interfaceClass},
new InvocationHandler() {
public Object invoke(Object obj, Method
method, Object[] args) {
Integer returnNum = (Integer) method.invoke(implementsClass.newInstance(),
args);
return returnNum - discount;
}
});
}
新业务调用:
public class ProxySaleAction{
pubic void saleByProxy()throws Exception{
IBoss boss = ProxyBoss.getProxyBoss(10,IBoss.class,Boss.class);
System.out.println("代理经营!");
int money = boss.yifu("xxl");
System.out.println("衣服成交价:" + money);
}
}