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

代理设计模式(Proxy)

功能:可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。

代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

我们来思考一下这种情况,当原有的业务处理由于某种原因无法改变,而目前又需要扩展一些功能,此时可以通过代理模式实现:

静态代理

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

我们不改变原有代码而添加一个代理来实现:

java 复制代码
//业务接口
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();
    }
}

主要特点是:一个接口提供有两个子类,其中一个资料类是真实业务操作类,另外一个子类是代理业务操作类,能够实现的主要原因是在代理类中面向接口编程,可以覆写原接口方法时仍然调用原接口方法,然后在其上下文中增加功能------

java 复制代码
    @Override
    public void add() {
         // 上文还能加东西
        server.add();  // 原接口方法
        System.out.println("程序执行add方法,记录日志."); // 下文加东西
    }

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

动态代理

暂无,之后学了再说

参考内容

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

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

项目设计

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

相关推荐
天天被压力11 分钟前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力17 分钟前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A32 分钟前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵34 分钟前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
nice_lcj5201 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
微小的鱼1 小时前
Linux的渲染与显示系统链路
android·java·linux
是2的10次方啊1 小时前
设计模式与生活⑮:看到哪儿了,得有个地方替你记着
设计模式
Hhy_11071 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19902 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala
starzy19902 小时前
深入理解Scala递归函数:从栈溢出到尾调用优化
开发语言·scala