
package club.jiajiajia.test.staticproxy;
public interface BuyHouse {
void buyHosue();//买房子
}
package club.jiajiajia.test.staticproxy;
public class BuyHouseImpl implements BuyHouse {
@Override
public void buyHosue() {
System.out.println("买房子");
}
}
package club.jiajiajia.test.staticproxy;
public class BuyHouseProxy implements BuyHouse {
private BuyHouse buyHouse;
public BuyHouseProxy(final BuyHouse buyHouse) {
this.buyHouse = buyHouse;
}
@Override
public void buyHosue() {
System.out.println("买房前准备");
buyHouse.buyHosue();
System.out.println("买房后装修");
}
}
@Test
public void test1(){
BuyHouse bh=new BuyHouseImpl();//被代理对象
BuyHouse bh2=new BuyHouseProxy(bh);//代理对象
bh2.buyHosue();
System.out.println();
System.out.println("bh 对象是否是 BuyHouse 的实例:"+(bh instanceof BuyHouse));
System.out.println("bh 对象是否是 BuyHouseImpl 的实例:"+(bh instanceof BuyHouseImpl));
System.out.println("bh2 对象是否是 BuyHouse 的实例:"+(bh2 instanceof BuyHouse));
System.out.println("bh2 对象是否是 BuyHouseImpl 的实例:"+(bh2 instanceof BuyHouseImpl));
}
对于静态代理较为简单,不多说
/**
* 静态代理
* 所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
* 优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
* 缺点:
* 1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
* 2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
*/
重点:
所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
这点和jdk动态代理,和cglib动态代理有很大的区别
运行打印内容:
买房前准备
买房子
买房后装修
bh 对象是否是 BuyHouse 的实例:true
bh 对象是否是 BuyHouseImpl 的实例:true
bh2 对象是否是 BuyHouse 的实例:true
bh2 对象是否是 BuyHouseImpl 的实例:false