java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁
适配器模式将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。它经常用来适配现存的类而无需修改其源码
适配器类通常有三种实现方式:
在这个案例中,我们将创建一个适配器来将一个旧的硬盘驱动器接口适配到新的硬盘驱动器接口。
首先,我们定义两个接口,
OldHardDrive和NewHardDrive,分别代表旧的硬盘驱动器接口和新的硬盘驱动器接口:
//新的硬盘启动器接口
public interface NewHardDrive {
void read();
void write();
void connectToSystem();
}
//旧的硬盘启动器接口
public interface OldHardDrive {
void readData();
void writeData();
void connect();
}
定义旧硬盘驱动器的具体实现
public class OldHardDriveImpl implements OldHardDrive {
@Override
public void readData() {
System.out.println("Reading data from old hard drive...");
}
@Override
public void writeData() {
System.out.println("Writing data to old hard drive...");
}
@Override
public void connect() {
System.out.println("Connecting old hard drive...");
}
}
定义适配器
// 适配器类,将OldHardDrive接口适配到NewHardDrive接口
public class HardDriveAdapter extends OldHardDriveImpl implements NewHardDrive {
// 由于继承了Adaptee,所以可以直接使用Adaptee的方法
// 同时也需要实现Target接口中的方法
@Override
public void read() {
readData();
}
@Override
public void write() {
writeData();
}
@Override
public void connectToSystem() {
connect();
System.out.println("Adapter connected old hard drive to the new system.");
}
}
最后创建的测试类可以通过类适配器调用目标接口的方法
public class Client {
public static void main(String[] args) {
// 创建适配器,将旧硬盘驱动器传递给适配器
NewHardDrive adapter = new HardDriveAdapter();
// 使用适配器调用新接口的方法
adapter.connectToSystem();
adapter.read();
adapter.write();
}
}
在这个例子中,HardDriveAdapter 继承自 OldHardDriveImpl 并实现了 NewHardDrive 接口。当客户端调用 NewHardDrive.connectToSystem() 等方法时,实际上调用的是 HardDriveAdapter 中的 connectToSystem() 等方法,而 connectToSystem() 等方法内部又调用了 OldHardDriveImpl 的 connectToSystem()等 方法。
类适配器的一个潜在缺点是它依赖于适配者类的具体实现,这违反了里氏替换原则。如果适配者类的接口在未来发生变化,类适配器可能需要进行相应的修改,这可能导致代码的不稳定。
因此,在实际应用中,如果可能的话,更推荐使用对象适配器(Object Adapter),因为它不依赖于适配者类的具体实现,而是通过组合(composition)的方式使用适配者类的实例,从而减少了代码之间的耦合性。
还是上述的案例,改为使用对象适配器进行实现
//新旧驱动器接口未发生改变
public interface NewHardDrive {
void read();
void write();
void connectToSystem();
}
public interface OldHardDrive {
void readData();
void writeData();
void connect();
}
// 旧硬盘驱动器实现也未发生改变
public class OldHardDriveImpl implements OldHardDrive {
@Override
public void readData() {
System.out.println("Reading data from old hard drive...");
}
@Override
public void writeData() {
System.out.println("Writing data to old hard drive...");
}
@Override
public void connect() {
System.out.println("Connecting old hard drive...");
}
}
适配器不再继承旧硬盘驱动器的实现类
// 适配器类,将OldHardDrive接口适配到NewHardDrive接口
public class HardDriveAdapter implements NewHardDrive {
private OldHardDrive oldHardDrive;
public HardDriveAdapter(OldHardDrive oldHardDrive) {
this.oldHardDrive = oldHardDrive;
}
@Override
public void read() {
oldHardDrive.readData();
}
@Override
public void write() {
oldHardDrive.writeData();
}
@Override
public void connectToSystem() {
oldHardDrive.connect();
System.out.println("Adapter connected old hard drive to the new system.");
}
}
测试类也发生改变
public class Client {
public static void main(String[] args) {
// 创建旧硬盘驱动器实例
OldHardDrive oldHardDrive = new OldHardDriveImpl();
// 创建适配器,将旧硬盘驱动器传递给适配器
NewHardDrive adapter = new HardDriveAdapter(oldHardDrive);
// 使用适配器调用新接口的方法
adapter.connectToSystem();
adapter.read();
adapter.write();
}
}
在这个案例中,HardDriveAdapter 类充当了适配器的角色,它实现了 NewHardDrive 接口,并将旧硬盘驱动器的操作封装在其内部。这样,新系统就可以通过 HardDriveAdapter 类来操作旧硬盘驱动器,而无需关心旧接口的具体实现。这就是适配器模式的一个实际应用案例。
类适配器和对象适配器都是适配器模式的不同实现方式,它们各有优缺点,适用于不同的场景。以下是类适配器和对象适配器在Java中的优劣势对比:
优势:
劣势:
优势:
劣势:
代码相关代码可以参考 代码仓库🌐
ps:本文原创,转载请注明出处