介绍
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
适配器模式是一种 结构型设计模式。
类比
有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。
适配器模式中的角色
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。相当于插座
需要适配的类(Adaptee):也叫被适配的类,需要被适配的对象或类型。相当于插头。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。相当于插头转换器
适配器模式包括3种形式
- 类适配器模式
- 对象适配器模式
- 接口适配器模式(或又称作缺省适配器模式)
准备
目标接口
public interface Target {
void run();
}
需要适配的类
public class Adaptee {
public void execute(){
System.out.println("Adaptee execute()");
}
}
类适配器模式
适配器
public class Adapter extends Adaptee implements Target {
@Override
public void run() {
execute();
}
}
测试
class AdapterTest {
public static void main(String[] args) {
Target t = new Adapter();
t.run();
}
}
对象适配器模式
适配器
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void run() {
adaptee.execute();
}
}
测试
class AdapterTest {
public static void main(String[] args) {
Adaptee a=new Adaptee()
Target t = new Adapter(a);
t.run();
}
}
类适配器与对象适配器的区别
类适配器使用的是继承的方式,直接继承了Adaptee,所以无法对Adaptee的子类进行适配。
对象适配器使用的是组合的方式,·所以Adaptee及其子孙类都可以被适配。另外,对象适配器对于增加一些新行为非常方便,而且新增加的行为同时适用于所有的源。
基于组合/聚合优于继承的原则,使用对象适配器是更好的选择。但具体问题应该具体分析,某些情况可能使用类适配器会适合,最适合的才是最好的。
接口适配器模式
接口适配器模式(缺省适配模式)的思想是,为一个接口提供缺省实现
一般多用与java的桌面编程,如:swing、swt等
java.awt.KeyListener 是一个键盘监听器接口,该接口可实现多个方法,当我们只用到一个方法时,实现接口后,也要实现其他的接口方法(这些方法为空方法,因为我们不想实现),如下:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("hey geek!");
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
非常麻烦。于是我们引入一个默认适配器,让适配器把接口里的方法都实现一遍,使用时继承这个适配器,把需要的方法实现一遍就好了。JAVA里也为java.awt.KeyListener提供了这样一个适配器:java.awt.KeyAdapter。
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("fxcku!");
}
});
}
代码看起来简洁多了
感谢:
https://blog.csdn.net/mrkohaku/article/details/79087688?utm_source=app
https://blog.csdn.net/qq_38526573/article/details/87949811?utm_source=app
