适配器模式
适配器模式是一种结构型设计模式
简单说,就像网线和没有网线接口的电脑一样,需要一个适配器(中间者)进行转换
在代码中体现的就是
- 把这个类转换成客户希望的另一个类
- 不兼容的类能一起运行
而细分适配器又分两类
类适配器
类的适配器,就是对类的适配
举个例子:假设
喷火龙和裂空座继承了龙这个类,但是现在没有飞行这个方法,不可能在龙这个类里面加吧,那就不符合开闭原则了
如果是对类进行适配,那就是在喷火龙和裂空座下面又继承两个适配器类
缺点
- 在不支持多继承的语言中,一次只能适配一个适配器类,就像下面的代码例子中,
USBCable
类只能继承KeyBoard
类一样 - 如果龙的继承类很多,有烛龙,霸下,貔貅…很多的类那每个类都要弄一个适配器吗???那是完全不行的
对象适配器
对象适配器
再举上面的例子,原本就是这样
但是对象适配器首先弄了一个接口,飞行接口,然后龙的适配器
这个类去实现飞行的接口
interface Fly {
void modality();
}
class Dargon {
}
class DargonAdapter implements Fly {
private Dargon dargon;//可以看出这里是关联关系,即适配器与适配者之间是关联关系
public DargonAdapter(Dargon dargon){
this.dargon = dargon;
}
@Override
public void modality() {
System.out.println("各种飞行形式");
}
}
优点
对象适配器可以把不同的适配者适配到同一目标
根据OOP七大原则中的合成复用原则,尽量使用对象适配器的实现方式,多用组合/聚合,少用继承
代码演示
下面的例子应该更加形象一点
就是有线键盘和电脑无法直接连接,需要一个适配器(线)连接电脑(类似网线和没网线插口的电脑需要一个适配器链接一样)
package com.cai.adapter;
/**
* @Description
* @Author Cai
* @Date 2021-03-15 10:41
*/
public class Main {
public static void main(String[] args) {
Computer computer = new Computer();
KeyBoard keyBoard = new KeyBoard();
USBCable usbCable = new USBCable(keyBoard);
computer.USB(usbCable);
}
}
package com.cai.adapter;
/**
* @Description
* @Author Cai
* @Date 2021-03-15 10:40
*/
public class Computer {
public Computer(){
System.out.println("Computer 构造器启动");
}
public void USB(Switch s){//具体USB插什么
s.fun();
}
}
package com.cai.adapter;
public interface USBImplement {
void fun();
}
package com.cai.adapter;
/**
* @Description
* @Author Cai
* @Date 2021-03-15 10:40
*/
//要被适配的类: 键盘
public class KeyBoard implements USBImplement{
@Override
public void fun() {
System.out.println("链接键盘~~~");
}
}
package com.cai.adapter;
public interface Switch {
void fun();
}
package com.cai.adapter;
import lombok.AllArgsConstructor;
/**
* @Description
* @Author Cai
* @Date 2021-03-15 10:50
*/
@AllArgsConstructor
public class USBCable implements Switch{
private USBImplement usbImplement;
@Override
public void fun() {
usbImplement.fun();
}
}