zoukankan      html  css  js  c++  java
  • 代理模式

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

  • 相关阅读:
    linux下mysql数据导入到redis
    redis常用api
    springboot2.0+mybatis多数据源集成
    斐波那契数列(递归、非递归算法)
    从尾到头打印链表
    docker学习笔记:简单构建Dockerfile【Docker for Windows】
    python3+OpenGL环境配置
    【python库安装问题解决】UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 121: invalid start byte
    DA-GAN技术【简介】【机器通过文字描述创造图像】
    洛谷 P2045 方格取数加强版【费用流】
  • 原文地址:https://www.cnblogs.com/lzghyh/p/12676734.html
Copyright © 2011-2022 走看看