1.静态代理
/第一步:创建服务类接口,买房的动作接口 interface BuyHome{ void buyHomeByMonery(String str); } //第二步:实现服务接口,真实对象买房对象 class XiaoLiByHome implements BuyHome{ @Override public void buyHomeByMonery(String str) { System.out.println("小李花了"+str+"元买到了房子"); } } //第三步:创建代理类,代理类需要有真实对象的控制权 (引用) class SalesByHome implements BuyHome{ //拿了一个客户的钱,每一次只给一个客户买房 private BuyHome buyHome; public SalesByHome(final BuyHome buyHome) { this.buyHome = buyHome; } @Override public void buyHomeByMonery(String str) { System.out.println("我给你摇号。。。"); System.out.println("摇中号了,我去给你付钱,并把房子给你。。。"); buyHome.buyHomeByMonery(str); System.out.println("我也拿到了中介费,有缘再见。。"); } }
//测试类
public class SysUserTester {
public static void main(String[] args) {
//第四步:
XiaoLiByHome xiaoLiByHome = new XiaoLiByHome();
//把买房对象给中介,并付款
SalesByHome salesByHome = new SalesByHome(xiaoLiByHome);
salesByHome.buyHomeByMonery("500");
}
}
静态代理总结:
优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
动态代理
动态代理的主要特点就是能够在程序运行时JVM才为被代理对象生成代理对象。
常说的动态代理也叫做JDK代理也是一种接口代理,JDK中生成代理对象的代理类就是Proxy,所在包是java.lang.reflect
//第一步:创建服务类接口,买房的动作接口 interface BuyHome { void buyHomeByMonery(String str); } //第二步:实现服务接口,真实对象买房对象 class XiaoLiByHome implements BuyHome { @Override public void buyHomeByMonery(String str) { System.out.println("小李花了" + str + "元买到了房子"); } } //定义中介的职能 class SalesUtils { public static void method1() { System.out.println("我给你摇号。。。"); } public static void method2() { System.out.println("摇中号了,我去给你付钱,并把房子给你。。。"); } public static void method3() { System.out.println("我也拿到了中介费,有缘再见。。。"); } } class MyInvocationHandle implements InvocationHandler { private Object object; public MyInvocationHandle(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { SalesUtils.method1(); SalesUtils.method2(); method.invoke(object,args); SalesUtils.method3(); return null; } } //生产代理对象的工厂 class MyProxyFactory{ public static Object getProxy(Object target) { MyInvocationHandle myInvocationHandle = new MyInvocationHandle(target); Object object= Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), myInvocationHandle); return object; } }
public class SysUserTester {
public static void main(String[] args) {
//第四步:
BuyHome buyHome = new XiaoLiByHome();
BuyHome proxy =(BuyHome) MyProxyFactory.getProxy(buyHome);
proxy.buyHomeByMonery("5000");
}
}