随笔 - 100  文章 - 1  评论 - 0  阅读 - 13070 

适配器模式(Adapter Pattern)和代理模式(Proxy Pattern)都是结构型设计模式,它们在结构上可能类似,但在意图和应用场景上存在明显区别。以下是它们的核心区别及适用场景:

适配器模式

核心区别

  • 目标:适配器模式的主要目标是解决接口不兼容的问题,它用于将一个类的接口转换为客户端希望的另一个接口,从而使原本因为接口不匹配而不能一起工作的类可以协同工作。
  • 使用方式:适配器通常在已有代码和 API 基础上工作,适配器类封装了被适配对象,提供目标接口所要求的方法。

适用场景

  • 当需要使用一个已经存在的类,而它的接口不符合你的需要时。
  • 当需要创建一个可以互相操作的系统,且系统中的类接口不兼容时。
  • 用于迁移遗留系统的老接口到新的应用中。

示例说明

示例: 假设需要使得一个旧的支付系统与新的支付接口进行交互。

// 新的支付接口
interface PaymentProcessor {
    void processPayment(double amount);
}

// 旧的支付系统类
class OldPaymentSystem {
    void makePayment(double amount) {
        System.out.println("Old Payment System: Payment of $" + amount + " processed.");
    }
}

// 适配器类
class PaymentAdapter implements PaymentProcessor {
    private OldPaymentSystem oldPaymentSystem;

    public PaymentAdapter(OldPaymentSystem oldPaymentSystem) {
        this.oldPaymentSystem = oldPaymentSystem;
    }

    @Override
    public void processPayment(double amount) {
        oldPaymentSystem.makePayment(amount);
    }
}

代理模式

核心区别

  • 目标:代理模式的主要目标是控制对对象的访问,代理对象可以在不改变目标对象接口的前提下,添加额外的功能(如控制、缓存、日志、安全权限等)。
  • 使用方式:代理通常为被代理对象提供相同的接口,并包含对控制目标对象访问的方法。

适用场景

  • 需要在访问对象时添加额外的功能,例如权限控制、延迟加载、日志记录等。
  • 需要生成对原始对象的轻量级代理以控制其访问。
  • 远程代理为对象在不同地址空间中提供局部代表,虚代理用于创建开销较大的对象,保护代理则控制访问。

示例说明

示例: 使用代理模式来实现对银行账户的访问控制。

// 银行账户接口
interface BankAccount {
    void withdraw(double amount);
}

// 实现银行账户
class RealBankAccount implements BankAccount {
    private double balance;

    public RealBankAccount(double balance) {
        this.balance = balance;
    }

    @Override
    public void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
            System.out.println("Withdrawal of $" + amount + " successful. Remaining balance: $" + balance);
        } else {
            System.out.println("Withdrawal of $" + amount + " failed. Insufficient balance.");
        }
    }
}

// 代理类
class BankAccountProxy implements BankAccount {
    private RealBankAccount realBankAccount;
    private double balance;

    public BankAccountProxy(double balance) {
        this.realBankAccount = new RealBankAccount(balance);
    }

    @Override
    public void withdraw(double amount) {
        System.out.println("Proxy control: Logging withdrawal attempt...");
        realBankAccount.withdraw(amount);
    }
}

总结

  • 适配器模式专注于将现有接口与未来的使用需求相匹配,强调接口的兼容性。
  • 代理模式着重于控制(例如访问控制、性能监测等)现有对象的访问,强调功能的扩展性和灵活性。

选择使用哪个模式,主要取决于您希望解决的问题是接口兼容性还是对访问的控制和拓展。

posted on   卡米i  阅读(18)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示