Java 中代理设计模式,请用代码具体举例

代理设计模式是一种结构型设计模式,它允许你提供一个代理或者占位符以控制对其他对象的访问。以下是一个简单的 Java 示例,演示了代理设计模式的用法:

java 复制代码
// 定义一个接口
interface Image {
    void display();
}

// 创建一个实现了 Image 接口的具体类
class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }

    private void loadFromDisk() {
        System.out.println("Loading " + filename);
    }

    public void display() {
        System.out.println("Displaying " + filename);
    }
}

// 创建一个代理类,实现了 Image 接口
class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

// 示例
public class Main {
    public static void main(String[] args) {
        // 使用代理显示图片
        Image image1 = new ProxyImage("cat.jpg");
        image1.display();

        // 图片已加载,再次显示图片,不需要重新加载
        Image image2 = new ProxyImage("dog.jpg");
        image2.display();
    }
}

在这个例子中,Image 接口定义了显示图片的方法 display(),RealImage 类是一个实现了 Image 接口的具体类,负责实际加载并显示图片。ProxyImage 类也实现了 Image 接口,并在其内部维护了一个 RealImage 对象的引用。当调用 display() 方法时,如果 RealImage 对象尚未创建,则会创建一个新的 RealImage 对象并调用其 display() 方法,否则直接调用已存在的 RealImage 对象的 display() 方法。

在 Main 类中,我们使用代理来加载和显示图片,当第一次显示图片时,代理会创建实际的图片对象并显示,而当再次显示同一张图片时,代理直接调用已存在的图片对象的显示方法,不需要重新加载。这样可以提高性能并延迟创建真实对象的时间。

相关推荐
10km13 分钟前
java:Apache Commons Configuration2占位符解析异常的正确解法:${prefix:name:-default}
java·apache·configuration2·变量插值·interpolation
customer0813 分钟前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
灰色人生qwer21 分钟前
SpringBoot 项目配置日志输出
java·spring boot·后端
2301_7930698231 分钟前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm
阿华的代码王国37 分钟前
【从0做项目】Java搜索引擎(6)& 正则表达式鲨疯了&优化正文解析
java·后端·搜索引擎·正则表达式·java项目·从0到1做项目
服务端相声演员37 分钟前
Oracle JDK、Open JDK zulu下载地址
java·开发语言
是姜姜啊!38 分钟前
java连接redis
java·redis
hhw19911240 分钟前
spring boot知识点5
java·数据库·spring boot
EQUINOX142 分钟前
lab4 CSAPP:Cachelab
java·后端·spring
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源