public class Partner {
private String name;
public Partner(String name) {
this.name = name;
}
}
public class Partner {
private String name;
public Partner(String name) {
this.name = name;
}
/**
* 收钱
* @param money
*/
public void receiveMoney(int money) {
System.out.println(name + "收到佣金:" + money + "元 ~ ");
}
/**
* 陪玩
* @param player
*/
public void playWith(Player player) {
System.out.println(name + "与" + player.getName() + "一起愉快地玩耍 ~ ");
}
}
public class Client {
public static void main(String[] args) throws Exception {
Player player = new Player("郝武辽");
Partner partner = new Partner("肖洁洁");
partner.receiveMoney(200);
partner.playWith(player);
}
}
肖洁洁收到佣金:200元 ~
肖洁洁与郝武辽一起愉快地玩耍 ~
public class PartnerPlatform {
private static List<Partner> partners = new ArrayList<>();
static {
partners.add(new Partner("肖洁洁"));
partners.add(new Partner("田苟"));
partners.add(new Partner("高总裁"));
}
}
public static Partner getPartner(int money) {
Partner partner = partners.remove(0);
return (Partner) Proxy.newProxyInstance(partner.getClass().getClassLoader(), partner.getClass().getInterfaces(),
new InvocationHandler() {
private int budget = money;
private boolean status = false;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("receiveMoney")) {
int money = (int) args[0];
// 平台需要运营,抽成一半
args[0] = money / 2;
// 如果在付钱时没给够,则标记budget为异常值
this.status = money >= budget;
}
if (status) {
return method.invoke(partner, args);
}
return null;
}
});
}
public class Client {
public static void main(String[] args) throws Exception {
Player player = new Player("郝武辽");
Partner partner = PartnerPlatform.getPartner(50);
partner.receiveMoney(20);
partner.playWith(player);
}
}
public static Partner getPartner(int money) {
Partner partner = partners.remove(0);
// 使用Cglib的Enhancer创建代理对象
return (Partner) Enhancer.create(partner.getClass(), new MethodInterceptor() {
private int budget = money;
private boolean status = false;
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable {
// 如果在付钱时没给够,则标记budget为异常值
if (method.getName().equals("receiveMoney")) {
int money = (int) args[0];
this.status = money >= budget;
}
if (status) {
return method.invoke(partner, args);
}
return null;
}
});
}
public class Client {
public static void main(String[] args) throws Exception {
Player player = new Player("郝武辽");
// 此处的Partner是a_basic包下的,不是接口 是类
Partner partner = PartnerPlatform.getPartner(50);
partner.receiveMoney(20);
partner.playWith(player);
partner.receiveMoney(200);
partner.playWith(player);
}
}