做公司网站利润,wordpress图片链接到附件,进不去的网站用什么浏览器,为公司设计一个网站设计模式浅析(七) 适配器模式
日常叨逼叨
java设计模式浅析#xff0c;如果觉得对你有帮助#xff0c;记得一键三连#xff0c;谢谢各位观众老爷#x1f601;#x1f601; 适配器模式
概念
适配器模式将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼…设计模式浅析(七) ·适配器模式
日常叨逼叨
java设计模式浅析如果觉得对你有帮助记得一键三连谢谢各位观众老爷 适配器模式
概念
适配器模式将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。它经常用来适配现存的类而无需修改其源码
组成
目标接口Target Interface这是客户端所期望的接口也就是客户端真正需要的接口。目标接口定义了客户端想要使用的方法。适配者类Adaptee Class这是需要被适配的原始接口。适配者类通常是一个已经存在的类它包含了一些客户端希望使用的方法但这些方法的接口与客户端所期望的接口并不一致。适配器类Adapter Class这是适配器模式的核心部分。适配器类实现了目标接口并在其内部调用了适配者类的方法。这样客户端就可以通过调用适配器类的方法来间接调用适配者类的方法从而实现了接口转换。
主要实现方式
适配器类通常有三种实现方式
类适配器通过继承适配者类并实现目标接口来实现。这种方式的缺点是它要求适配者类必须是一个类而不能是一个接口。此外由于是通过继承来实现的因此类适配器只能适配一个适配者类。对象适配器通过组合适配者类的实例并实现目标接口来实现。这种方式的优点是它不需要继承适配者类因此可以适配接口或类。此外对象适配器可以适配多个适配者类只需要在适配器类中持有多个适配者类的实例即可。接口适配器默认适配器当不希望实现接口中的所有方法时可以创建一个抽象类实现该接口并为所有方法提供默认实现。子类可以选择性地覆盖这些方法。
案例 在这个案例中我们将创建一个适配器来将一个旧的硬盘驱动器接口适配到新的硬盘驱动器接口。 类适配器实现 首先我们定义两个接口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 {Overridepublic void readData() {System.out.println(Reading data from old hard drive...);}Overridepublic void writeData() {System.out.println(Writing data to old hard drive...);}Overridepublic void connect() {System.out.println(Connecting old hard drive...);}
}定义适配器 // 适配器类将OldHardDrive接口适配到NewHardDrive接口
public class HardDriveAdapter extends OldHardDriveImpl implements NewHardDrive {// 由于继承了Adaptee所以可以直接使用Adaptee的方法// 同时也需要实现Target接口中的方法Overridepublic void read() {readData();}Overridepublic void write() {writeData();}Overridepublic 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 {Overridepublic void readData() {System.out.println(Reading data from old hard drive...);}Overridepublic void writeData() {System.out.println(Writing data to old hard drive...);}Overridepublic 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;}Overridepublic void read() {oldHardDrive.readData();}Overridepublic void write() {oldHardDrive.writeData();}Overridepublic 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中的优劣势对比
类适配器Class Adapter
优势
代码简洁性类适配器通常只需要一个适配器类该类继承自适配者类并实现目标接口。这种实现方式相对简单和直接。多重继承问题如果目标接口和适配者类都继承自同一个基类或有相同的接口那么类适配器就无法工作。在这种情况下对象适配器是更好的选择。
劣势
继承的局限性类适配器使用了继承这意味着适配器类不能同时适配多个不兼容的接口因为Java不支持多重继承。扩展性问题如果适配者类的接口发生改变可能需要修改适配器类的代码这违背了开放封闭原则OCP。
对象适配器Object Adapter
优势
灵活性对象适配器使用对象组合而不是继承因此可以适配多个不兼容的接口解决了类适配器中多重继承的问题。更好的遵循OCP由于使用对象组合当适配者类的接口发生改变时只需要修改适配器类的代码而不需要修改客户端代码这更符合开放封闭原则。更好的解耦对象适配器减少了客户端和适配者之间的耦合度因为客户端只依赖于目标接口而不是具体的适配者类。
劣势
代码复杂性与类适配器相比对象适配器可能需要更多的代码因为需要创建适配器对象并调用其方法。额外的对象创建开销由于使用了对象组合每次需要适配时都需要创建一个新的适配器对象这可能会增加一些额外的内存开销。 代码相关代码可以参考 代码仓库
ps本文原创转载请注明出处