适配器模式(Adapter Pattern)
创始人
2024-05-25 06:34:16
0

1.什么是适配器模式?

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

2.适配器模式的例子

举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

3.适配器模式的优缺点

优点: 

  1. 可以让任何两个没有关联的类一起运行。
  2. 提高了类的复用。
  3. 增加了类的透明度。
  4. 灵活性好。

缺点: 

  1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。
  2. 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

创建一个 maven 项目 adapter : 引入依赖
org.springframework  springwebmvc 5.3.4

4.自定义适配器:

创建包 adapter,在包下创建二孔插座接口 Socket,三个插头的充电器类 Charger

cn.xs.adapter.Socket 代码如下:

public interface Socket {/*** 连接功能*/default void connect() {System.out.println("用两个孔的插头进行连接!");}/*** 充电功能*/void charge();
}

 cn.xs.adapter.Charger 代码如下:

public class Charger {/*** 充电*/public void charge() {System.out.println("若已连接,进行充电!");}
}
1.类适配器模式: cn.xs.adapter.ChargerClassAdapter 代码:
public class ChargerClassAdapter extends Charger implements Socket {
/**
* 重新适配连接功能
*/
@Override
public void connect() {
System.out.println("用三个孔的插头进行连接!");
}
}
新建测试类进行测试:
public class TestCharge {
/**
* 测试方法
*
* @param args
*/
public static void main(String[] args) {
// 1. 类适配器
Socket adapter = new ChargerClassAdapter();
adapter.connect();
adapter.charge();
}
}
2.对象适配器模式: cn.xs.adapter.ChargerObjectAdapter 代码:
public class ChargerObjectAdapter implements Socket {
/* 声明要使用的对象 */
private Charger charger;
/**
* 实例化 Charger 对象
*
* @param charger
*/
public ChargerObjectAdapter(Charger charger) {
this.charger = charger;
}
/**
* 重新适配连接功能
*/
@Override
public void connect() {
System.out.println("用三个孔的插头进行连接!");
}
/**
* 重新适配充电功能
*/
@Override
public void charge() {
charger.charge();
}
}
测试:
/**
* 测试方法
*
* @param args
*/
public static void main(String[] args) {
// 2. 对象适配器
Charger charger = new Charger();
ChargerObjectAdapter adapter = new ChargerObjectAdapter(charger);
adapter.connect();
adapter.charge();
}
类适配器与对象适配器的区别: 类适配器使用的是继承的方式,直接继承了 Charger,所以无法对 Charger 的子类进行适配。 对象适配器使用的是组合的方式,·所以 Charger 及其子孙类都可以被适配。另外,对象适配器对于增加一些新行为非常方便,而且新增加的行为同时适用于所有的源。 基于组合/聚合优于继承的原则,使用对象适配器是更好的选择。但具体问题应该具体分析,某些情况可能使用类适配器会适合,最适合的才是最好的。 3.接口适配器模式(缺省适配模式): 思想:为一个接口提供缺省实现,这样子类可以从这个缺省实现进行扩展,而不必从原有接口进行 扩展。 这里提供一个例子。 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("喝热水能治百病?");
}
@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("喝热水能治百病?");
}
});
}

这样不必再把每个方法都实现一遍,代码看起来简洁多了。在任何时候,如果不准备实现一个接口里的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,实现所有方法,这样,从这个抽象类再继承下去的子类就不必实现所有的方法,只要重写需要的方法就可以了。

适配器模式的优缺点: 优点:                 1.更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。                 2.更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。 缺点:                 1.会导致系统紊乱:滥用适配器,会让系统变得非常零乱。 例如,明明看到调用的是A接口,其实内 部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...