适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,用于解决不兼容接口之间的工作问题,通过引入一个适配器类来重新包装一个已有的类或接口,使其接口与其他的代码兼容。

通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。

适配器模式通常用于使现有代码适应新的接口需求,从而允许原本因接口不兼容而不能一起工作的类可以一起工作。

实例1:对下面的例子做简单实现

// 我们面对的场景是一个银行账户系统,
// 其中包括几种类型的账户和一个特殊的海外账户(OffshoreAccount)。
// 由于OffshoreAccount具有不同的接口和额外的功能(如处理税率),
// 它不能直接与现有的账户系统集成。
// 因此,我们使用适配器模式来允许OffshoreAccount适配到现有的账户接口。

// 账户接口
interface Account {
    double getBalance();
    void credit(double amount);
}

// 抽象账户类
abstract class AbstractAccount implements Account {
    protected double balance;
    protected boolean isOverdraftAvailable;

    public AbstractAccount(double balance) {
        this.balance = balance;
        this.isOverdraftAvailable = false;
    }

    @Override
    public double getBalance() {
        return balance;
    }

    @Override
    public void credit(double amount) {
        this.balance += amount;
    }

    public boolean isOverdraftAvailable() {
        return isOverdraftAvailable;
    }

    public void setOverdraftAvailable(boolean isOverdraftAvailable) {
        this.isOverdraftAvailable = isOverdraftAvailable;
    }
}

// 海外账户类
class OffshoreAccount {
    private double balance;
    private static final double TAX_RATE = 0.08;

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

    public double getTaxRate() {
        return TAX_RATE;
    }

    public double getOffshoreBalance() {
        return balance;
    }

    public void debit(double amount) {
        balance -= amount;
    }

    public void credit(double amount) {
        balance += amount;
    }
}

// 账户适配器类
class AccountAdapter implements Account {
    private OffshoreAccount offshoreAccount;

    public AccountAdapter(OffshoreAccount offshoreAccount) {
        this.offshoreAccount = offshoreAccount;
    }

    @Override
    public double getBalance() {
        // 考虑税率后计算余额
        return offshoreAccount.getOffshoreBalance() * (1 - offshoreAccount.getTaxRate());
    }

    @Override
    public void credit(double amount) {
        // 直接调用海外账户的存款方法
        offshoreAccount.credit(amount);
    }
}

// 客户端使用示例
public class Client {
    public static void main(String[] args) {
        OffshoreAccount offshoreAccount = new OffshoreAccount(1000);
        Account account = new AccountAdapter(offshoreAccount);
        System.out.println("账户余额: " + account.getBalance());  // 输出调整后的余额,考虑税率
        account.credit(200);
        System.out.println("更新后的账户余额: " + account.getBalance());  // 再次输出调整后的余额
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值