版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79697683
源码git地址 https://github.com/dlovetco/designMode
问题提出
小明新买了一台电脑,但是发现显示器是HDMI的接口,而自己只有VGA的线。所以没办法只能再买一个转接口来连接显示器和主机。 用代码实现上述场景。
适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
package adaptermode;
public class AdapterMode {
public static void main(String[] args) {
Vga vga = new Host();
vga.connectVga();
HdmiToVga hdmiToVga = new HdmiToVga();
hdmiToVga.connectVga();
}
}
class Screen {
public void connectHdmi() {
System.out.println("显示器连接");
}
}
interface Vga {
void connectVga();
}
class Host implements Vga {
@Override
public void connectVga() {
System.out.println("主机连接");
}
}
/**
* 转接口类
*/
class HdmiToVga implements Vga {
private Screen screen = new Screen();
@Override
public void connectVga() {
screen.connectHdmi();
}
}
由于显示器和主机的接口不对称,所以我们需要加一个“中转类”HdmiToVga。这个类其实就是适配器模式中的适配器。不知道大家写下来有没有一种感觉,这个适配器模式跟代理模式怎么这么像,都是在两个类之间加了一层类。大家仔细看会发现,其实两种模式的侧重点是不一样的。代理模式侧重于隐蔽,代理类的方法名和被代理类的方法名是一样的(虽然不一样也没什么关系,但名字一样更加符合代理模式的性质)。而适配器模式侧重于将一个类或者接口转换成另外一个类或者接口。适配器模式通常用于当已存在一个类但它的方法和你要求的不一样的时候。
适配器模式往往是在编码阶段实在遇到问题的时候使用的,在设计模式我们可以通过设计统一的接口来避免类和接口的转换。(因为这个代价可以从设计阶段避免掉,所以适配器模式其实是作为一种设计存在缺陷时的亡羊补牢的手段)
plantuml
class Screen{
connectHdmi()
}
interface Vga{
connectVga()
}
Vga <|.. Host
class Host{
}
Screen <-- HdmiToVga
Vga <|.. HdmiToVga
class HdmiToVga{
Screen screen
connectVga()
}