设计模式-代理模式

理解代理模式:使用房屋中介案例

代理模式(Proxy Pattern)是结构型设计模式之一,通过代理对象来控制对真实对象的访问。代理对象在不改变真实对象的情况下,可以添加一些额外的逻辑,例如访问控制、延迟加载等。本文将通过一个房屋中介的案例,详细介绍代理模式的概念、应用场景以及代码实现。

什么是代理模式?

代理模式 | 菜鸟教程 (runoob.com)

代理模式提供了一个代理对象,控制对其他对象的访问。代理对象可以在不改变真实对象的情况下,添加额外的功能或控制。代理模式通常用于以下场景:

  • 访问控制:控制对资源的访问权限。

  • 性能优化:在实际使用时才创建和初始化资源。

  • 日志记录:记录对真实对象的操作日志。

  • 远程代理:控制对远程对象的访问。

代理模式的优缺点

优点

  • 单一职责原则:代理模式将实际的业务处理和附加的功能分离开来,使代码更加清晰和可维护。

  • 开闭原则:可以在不修改现有代码的情况下,通过代理模式添加新功能。

  • 控制访问:代理对象可以控制对真实对象的访问。

缺点

  • 增加复杂性:引入代理对象会增加系统的复杂性和理解难度。

  • 性能开销:代理模式会带来一些额外的性能开销,例如方法调用的额外开销。

案例介绍

小明想要购买一套房子,他决定寻求一家房屋中介来帮助他找到一个面积超过100平方米的房子,只有符合条件的房子才会被传递给小明查看。

【设计模式专题之代理模式】7-小明买房子 (kamacoder.com)

输入描述

第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。

接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。

输出描述

对于每个房子,输出一行,表示是否符合购房条件。如果房屋面积超过100平方米,输出 "YES";否则输出 "NO"。

输入示例
复制代码
3
120
80
110
输出示例
复制代码
YES
NO
YES
代码实现

我们将通过代理模式来实现这个需求,首先定义一个 House 接口 ,然后定义 RealHouseProxyHouse

  1. 定义接口 House

    • House 接口定义了一个 display 方法,所有房子类都要实现这个方法。
java 复制代码
interface House {
    void display();
}
  1. 真实对象 RealHouse

    • RealHouse 实现了 House 接口,表示具体的房子。它有一个 size 属性表示房子的面积。

    • display 方法用于输出房子的基本信息,在这个例子中输出 "YES"。

java 复制代码
class RealHouse implements House {
    private int size;

    public RealHouse(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    @Override
    public void display() {
        System.out.println("YES");
    }
}
  1. 代理对象 ProxyHouse

    • ProxyHouse 也实现了 House 接口,包含一个 List<RealHouse> 用于存储所有的房子对象。

    • addHouse 方法用于添加房子对象到列表中。

    • display 方法遍历房子列表,检查每个房子的面积是否大于100平方米,如果大于则调用 RealHousedisplay 方法输出 "YES",否则输出 "NO"。

java 复制代码
class ProxyHouse implements House {
    private List<RealHouse> realHouses = new ArrayList<>();

    public void addHouse(RealHouse realHouse) {
        realHouses.add(realHouse);
    }

    @Override
    public void display() {
        for (RealHouse realHouse : realHouses) {
            if (realHouse.getSize() > 100) {
                realHouse.display();
            } else {
                System.out.println("NO");
            }
        }
    }
}
  1. 主程序 Main

    • 从输入中读取房子的数量和面积。

    • 创建 ProxyHouse 实例,并将每个 RealHouse 对象添加到代理对象中。

    • 调用代理对象的 display 方法,显示房子的筛选结果。

java 复制代码
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        ProxyHouse proxyHouse = new ProxyHouse();
        
        for (int i = 0; i < n; i++) {
            int size = sc.nextInt();
            RealHouse realHouse = new RealHouse(size);
            proxyHouse.addHouse(realHouse);
        }
        
        proxyHouse.display();
        
        sc.close();
    }
}

代理模式的作用

在这个案例中,代理模式的作用如下:

  • ProxyHouse 对象作为 RealHouse 对象的代理,对外提供统一的接口 display

  • ProxyHouse 对象在调用 RealHousedisplay 方法之前,先进行了面积的检查,只有面积大于100平方米的房子才会调用 RealHousedisplay 方法输出 "YES",否则输出 "NO"。

通过代理模式,我们将筛选逻辑从主程序中抽离出来,封装到 ProxyHouse 中,使得代码更加清晰,符合单一职责原则。代理模式还可以让我们在不修改 RealHouse的情况下,添加额外的控制逻辑,提高代码的灵活性和可维护性。

完整代码

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// House接口
interface House {
    void display();
}

// RealHouse类实现House接口
class RealHouse implements House {
    private int size;

    public RealHouse(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    @Override
    public void display() {
        System.out.println("YES");
    }
}

// ProxyHouse类实现House接口
class ProxyHouse implements House {
    private List<RealHouse> realHouses = new ArrayList<>();

    public void addHouse(RealHouse realHouse) {
        realHouses.add(realHouse);
    }

    @Override
    public void display() {
        for (RealHouse realHouse : realHouses) {
            if (realHouse.getSize() > 100) {
                realHouse.display();
            } else {
                System.out.println("NO");
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        ProxyHouse proxyHouse = new ProxyHouse();
        
        for (int i = 0; i < n; i++) {
            int size = sc.nextInt();
            RealHouse realHouse = new RealHouse(size);
            proxyHouse.addHouse(realHouse);
        }
        
        proxyHouse.display();
        
        sc.close();
    }
}

总结

代理模式在软件设计中有广泛的应用,它通过一个代理对象控制对真实对象的访问,使代码更具灵活性和可维护性。在本例中,我们通过代理模式实现了房屋中介的功能,筛选出符合条件的房子并展示给小明。希望通过这个案例,大家能更好地理解代理模式的概念和应用场景,并在实际开发中灵活应用。

相关推荐
xmh-sxh-13144 分钟前
常用的前端框架有哪些
java
老马啸西风8 分钟前
NLP 中文拼写检测纠正论文 A Hybrid Approach to Automatic Corpus Generation 代码实现
java
小蒜学长9 分钟前
基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)
java·前端·数据库·spring boot·后端·旅游·宠物
L.S.V.9 分钟前
Java 溯本求源之基础(三十一)——泛型
java·开发语言
Redamancy_Xun16 分钟前
开源软件兼容性可信量化分析
java·开发语言·程序人生·网络安全·测试用例·可信计算技术
IDRSolutions_CN24 分钟前
(教程)用 Java 从 PDF 中提取嵌入的文件
java·经验分享·pdf·软件工程·团队开发
海波东26 分钟前
单例模式懒汉式、饿汉式(线程安全)
java·安全·单例模式
lwprain38 分钟前
解决tomcat双击startup.bat乱码的几种方法
java·tomcat
小汤猿人类1 小时前
nacos-gateway动态路由
java·前端·gateway
GraduationDesign1 小时前
基于SpringBoot的在线文档管理系统的设计与实现
java·spring boot·后端