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");
    }
}

 

posted on 2020-04-10 22:43  幂次方  阅读(179)  评论(0编辑  收藏  举报