本文总结于视频狂神说:狂神说java设计模式
适配器模式核心
当一个类需要使用到另外一个类的方法时,而这两个类之间并没有任何关系,如果一味的使用 new 对象的方式则非常冗余,所以需要一个适配器来拉近两者的关系,例如 B 类持有适配器对象,将 A 对象传入适配器中,让适配器调用 A 的方法。
假如:有一台电脑,网线,电脑和网线的接口不一样,这时候需要一个网线转接口来连接电脑和网线才能正常上网
代码实现:
demo-1 【类适配模式】
类结构图
定义一个网线类
//网线类
public class NetLine {
public void linkNet(){
System.out.println("连接到网络,可以上网!");
}
}
适配器接口,用于连接电脑和网线
public interface Adapter {
/*连接网线*/
void connectNetLine();
}
适配器实现类
这里的适配器实现类继承了网线,有了网线的功能
public class AdaptImpl extends NetLine implements Adapter {
@Override
public void connectNetLine() {
super.linkNet();
}
}
电脑类
电脑连接网络需要传入一个适配器参数,利用这个适配器去连接网线
//电脑类
public class Computer {
//给电脑传入一个适配器
public void toNet(Adapter adapter){
adapter.connectNetLine();
}
}
测试:
public static void main(String[] args) {
Computer computer = new Computer();
computer.toNet(new AdaptImpl());
}
结果
分析
使用类适配发现,适配器是继承网线的,如果要求该适配器要去适配其他的网线就要重新修改代码,这就带来了局限性
因此引出下面的对象适配器模式
demo-2 【对象适配器模式】
对象适配器使得之前的适配器不再继承任何对象,但是在使用的时候需要有网线的实例。前面的代码结构不变。
只需要修改下适配器实现类,代码如下:
public class AdapterImpl2 implements Adapter {
private NetLine netLine;
public AdapterImpl2(NetLine netLine) {
this.netLine = netLine;
}
@Override
public void connectNetLine() {
this.netLine.linkNet();
}
}
测试类
public static void main(String[] args) {
Computer computer = new Computer();
//computer.toNet(new AdaptImpl());
computer.toNet(new AdapterImpl2(new NetLine()));
}
结果