- 静态代理
例如租房子。
public interface Leasing {
public String doLeasing(String name,long money);
}
一般实现类
public class LeasingImpl implements Leasing {
public String doLeasing(String name ,long money)
{
return name+"租到房,价格:"+money;
}
}
中介的实现类
public class PreoxyLeasing implements Leasing {
LeasingImpl mLeasImpl;
public PreoxyLeasing( LeasingImpl mLeasImpl) {
this.mLeasImpl =mLeasImpl;
}
@Override
public String doLeasing(String name,long money) {
getMoeyFromUser();
System.out.println("用户多花了"+(money/2));
getMoeyFromHouser();
System.out.println("房东多花了"+(money/2));
return name+"中介帮忙租到房子 价格:"+money;
}
public void getMoeyFromUser() {
System.out.println("收取用户的一半租金");
}
public void getMoeyFromHouser() {
System.out.println("收取房东的一半租金");
}
}
租客自己租房。
Leasing mLeas = new LeasingImpl();
System.out.println(mLeas.doLeasing("自己",1000l));
租客通过中介来租房
Leasing mLeas = new LeasingImpl();
mLeas = new PreoxyLeasing(new LeasingImpl());
System.out.println(mLeas.doLeasing("中介",1000l));
- 动态代理。
首先实现InvocationHandler接口,处理invoke方法,使用动态代理,调用每个方法都会执行invoke方法。
public class LeasingHandler implements InvocationHandler {
Object mBase;
public LeasingHandler(Object mBase) {
this.mBase = mBase;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//拦截方法
if("doLeasing".equals(method.getName()))
{
{
System.out.println("收用户一半的房租");
System.out.println("收房主一半的房租");
Long money = (Long) args[1];
money +=money/2;
// 帮忙租房子
String things = (String) method.invoke(mBase,args[0], money);
return things;
}
}
return null;
}
}