适配器模式(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()); // 再次输出调整后的余额
}
}