抽象主题:
/**
* 抽象主题,房东
*
* 缺点:跟目标对象一样实现了抽象业务的接口,一旦抽象业务接口
* 发生改变也必须跟着改变,可以使用动态代理(反射机制)解决
* */
public interface HouseOwner {
/**
* 出租房屋
* */
public void rent();
/**
* 收租
* */
public void getMoney();
/**
* 房子日常保养
* */
public void maintain();
}
真实主题:
/**
* 具体主题 ,民防,城中存房东类
* */
public class VillageHouseOwner implements HouseOwner {
@Override
public void rent() {
System.out.println("出租单间一个月500,有热水器,有床,有独立卫生间,押一付一");
}
@Override
public void getMoney() {
System.out.println("收起每月月租,水电费,生活垃圾费");
}
@Override
public void maintain() {
System.out.println("房子日常维护,家电日常维修");
}
}
代理类:
/***
*
* jdk动态代理,用来代理目标业务对象
* */
public class JdkProxy implements InvocationHandler {
/**
* 要代理的目标对象,使用反射机制动态创建代理对象
* */
private Object targetObject;
public JdkProxy(){
}
public JdkProxy(Object targetObject){
this.targetObject=targetObject;
}
public Object creaProxy(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(
targetObject.getClass().getClassLoader(), //目标对象类加载器
targetObject.getClass().getInterfaces()//目标对象实现的接口
,this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(this.targetObject, args);
if (method.getName().equals("rent")){//判断当前执行的方法是否rent方法
getProxyFee();
}
if (method.getName().equals("getMoney")){
procedureFee();
}
//使用反射动态调用目标的方法
return invoke;
}
public void getProxyFee(){
System.out.println("收取半个月的房租费当作中介费用,只收一次");
}
public void procedureFee(){
System.out.println("每个月固定收取手续费50块");
}
}
测试类:
public class Test {
public static void main(String[] args) {
JdkProxy proxy = new JdkProxy();
VillageHouseOwner villageHouseOwner = new VillageHouseOwner();
//创建代理对象
HouseOwner proxy1 = (HouseOwner) proxy.creaProxy(villageHouseOwner);
proxy1.rent();
proxy1.getMoney();
proxy1.maintain();
}
}