• Java复习-20-接口(3)- 代理设计模式


    代理设计模式(Proxy)

    功能:可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。
    代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
    我们来思考一下这种情况,当原有的业务处理由于某种原因无法改变,而目前又需要扩展一些功能,此时可以通过代理模式实现:
    在这里插入图片描述

    静态代理

    静态代理服务于单个接口,我们来考虑实际工程中的一个例子,现在已经有业务代码实现一个增删功能,原有的业务代码由于仍有大量程序无法改变,现在新增需求,即以后每执行一个方法输出一个日志。
    我们不改变原有代码而添加一个代理来实现:

    //业务接口
    interface DateService {
        void add();
        void del();
    }
    
    class DateServiceImplA implements DateService {
        @Override
        public void add() {
            System.out.println("成功添加!");
        }
    
        @Override
        public void del() {
            System.out.println("成功删除!");
        }
    }
    
    class DateServiceProxy implements DateService {
        DateService server;  // 面向接口编程,而不是面向实现,给代理类持有接口而不是持有具体的类,则对于所有实现该接口的类都可以使用该代理
    
        public DateServiceProxy(DateService server){
            this.server = server;  // 用于接收代理的真实子类 DateServiceImplA
        }
    
        @Override
        public void add() {
            server.add(); // 原接口抽象方法
            System.out.println("程序执行add方法,记录日志.");
        }
        @Override
        public void del() {
            server.del();
            System.out.println("程序执行del方法,记录日志.");
        }
    }
    
    //客户端
    public class Test {
        public static void main(String[] args) {
            DateService service = new DateServiceProxy(new DateServiceImplA); // 向上转型,但最终实例化的对象类型还是看等号左侧最外面包的一层是什么,此处本质上就是一个代理类
            service.add();
            service.del();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    主要特点是:一个接口提供有两个子类,其中一个子类是真实业务操作类,另外一个子类是代理业务操作类,能够实现的主要原因是

    在代理类中面向接口编程,可以覆写原接口方法时仍然调用原接口方法,然后在其上下文中增加功能——

        @Override
        public void add() {
             // 上文还能加东西
            server.add();  // 原接口方法
            System.out.println("程序执行add方法,记录日志."); // 下文加东西
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这样可以不变动真实子类的情况下,实现功能的扩充,而更本质的原因是接口和实现的独立性。

    动态代理

    暂无,之后学了再说

    参考内容

    掘金社区:https://juejin.cn/post/7000214639476736013

    面试题:抽象类和接口的区别

    在这里插入图片描述

    项目设计

    在项目的设计中,接口是项目整体设计最先考虑的,因为它代表的是一个标准,事件和物体的标准,而后才是抽象类。而普通类通常是是放于最底层才考虑的。

  • 相关阅读:
    <线性回归算法(Linear regression)>——《机器学习算法初识》
    前端 单元测试介绍 - 以及在项目中使用 (史上最全)
    【ArcGIS Pro二次开发】(73):使用NPOI库操作Excel
    flutter 随机数的生成 四舍五入
    Vue实现无限滚动加载更多内容(懒加载)或实现查看更多按钮
    R语言lavaan结构方程模型在复杂网络分析中的科研技术新趋势
    sql-labs第46关(order by盲注脚本)
    JAVA泛型
    Torch知识点总结【持续更新中......】
    UVM sequence 3种启动方式
  • 原文地址:https://blog.csdn.net/qq_41168765/article/details/132701060