mik*_*nne 44
我在一个需要与外部DVR接口的系统上工作.在大多数情况下,所有DVR都具有相同的基本功能:从某个视频源开始录制; 停止录音; 从某个时间开始播放; 停止播放等
每个DVR制造商都提供了一个软件库,允许我们编写代码来控制他们的设备(为了便于讨论,我将其称为SDK).即使每个SDK都提供了所有基本功能的API,但它们都不是完全相同的.这是一个非常粗略的例子,但你明白了:
我们的软件需要能够与所有DVR进行交互.因此,我们不是为每个不同的SDK编写可怕的开关/案例,而是创建了我们自己的公共IDVRController接口,并将所有系统代码写入该接口:
然后,我们为每个SDK编写了一个不同的适配器实现,所有这些实现都实现了我们的IDVRController接口.我们使用配置文件来指定系统将连接到的DVR的类型,并使用Factory模式来实例化该DVR的IDVRController的正确实现者.
这样,适配器模式使我们的系统代码更简单:我们总是编码为IDVRController.它允许我们在部署后为新的SDK推出适配器(我们的工厂使用反射来实例化正确的IDVRController实例).
bha*_*ran 14
现有接口
interface Shape {
public int calculateArea(int r);
}
Run Code Online (Sandbox Code Playgroud)
Shape 接口的当前实现
class Square implements Shape {
@Override
public int calculateArea(int r) {
return r * r;
}
}
Run Code Online (Sandbox Code Playgroud)
现在考虑您希望 Circle 类适应我们现有的界面,我们无法修改(由第三方编写)。
class Circle {
public double calculateCircularArea (int r) {
return 3.14 * r * r;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们已经使 Circle 实现适应我们的 Shape 接口。所以我们需要一个适配器,因为它们不兼容。
class CirCleAdaptor extends Circle implements Shape {
@Override
public int calculateArea(int r) {
return (int) calculateCircularArea(r);
}
}
Run Code Online (Sandbox Code Playgroud)
CircleAdaptor - 是 Circle
Circle的适配器 - 是 Adaptee
形状 - 是目标接口
public class AdapterPattern {
public static void main(String[] args) {
Shape circle = new CirCleAdaptor();
System.out.println("Circle Area " + circle.calculateArea(5));
Shape square = new Square();
System.out.println("Square Area " + square.calculateArea(5));
}
}
Run Code Online (Sandbox Code Playgroud)
希望这能更好地了解何时使用它。
当您必须处理具有相似行为的不同接口(这通常意味着具有相似行为但具有不同方法的类)时,可以使用适配器设计模式。例如,一个类连接到三星电视,另一个类连接到索尼电视。它们将共享常见的行为,例如打开菜单、开始播放、连接到网络等,但每个库都会有不同的实现(具有不同的方法名称和签名)。这些不同供应商特定的实现在 UML 图中称为“Adaptee” 。
因此,在您的代码(在 UML 图中称为Client )中,您可以创建一个通用接口(在 UML 图中称为Target )来包装这些类似的行为并工作,而不是对每个供应商(或Adaptee )的方法调用进行硬编码。仅使用一种类型的对象。
然后,适配器将实现目标接口,将其方法调用委托给通过构造函数传递给适配器的适配器。
为了让您在 Java 代码中实现这一点,我使用与上面提到的完全相同的示例编写了一个非常简单的项目,使用适配器来处理多个智能电视接口。该代码很小,文档齐全且不言自明,因此请深入研究它以了解现实世界的实现是什么样子。
只需下载代码并将其作为 Maven 项目导入 Eclipse(或您最喜欢的 IDE)即可。您可以通过运行org.example.Main.java来执行代码。请记住,这里重要的是了解如何将类和接口组装在一起来设计模式。我还在com.thirdparty.libs包中创建了一些假的适应者。希望能帮助到你!
https://github.com/Dannemann/java-design-patterns