1 概念
适配器模式把一个类的接口变换成客户端期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的俩个类能够在一起
工作。
这很像变压器(adapter),变压器把一种电压变换成另一种电压,把美国的电器拿回中国大陆来用的时候,用户就面临电压不同的问题美国的生活用电电压是110V,而中国的电压是220V。如果要在中国实用在美国的电器,就必须有一个能把220V电压转换成110V电压的变压器。而这正像本模式所做的事,因而次模式也常常被称为变压器模式。
2 适配器模式的分类
适配器模式有类的适配器模式和对象的适配模式2种不同的形式。
3 类的适配器模式
类的适配器模式把适配的类的api转换成为目标类的api
模式所涉及的角色有:
-
目标(target)角色:这就是所期待的接口,注意由于这里讨论的是类的适配器模式,目标不可以是类
Tsocket(插座)是一个接口,默认只能提供220V的电压,但是我们希望它还能提供110V的电压供美国电器使用、
-
源(source)角色:现有需要适配的类
Appliance(美国电器)是一个类,只能使用110V的电压,但是220V的电压是不能使用的,如果非要给美国电器加上220v的电压使用,可能直接就炸了。O(∩_∩)O
- 适配器(adapter)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然这一角色不可是接口,而必须是类。
Adapter(变压器)是一个类,它继承了Appliance(美国电器)类,并实现了Tsocket (插座)接口它可以将把110V的电压变到220V,300V,400V,牛逼的可以到10000V
4 类的适配器模式demo
4.1 定义Tsocket接口
package com.liuyu.target; /** * Tsocket(插座)对象作为定为一个接口 * target:既可以提供110v的电压,又可以提供220v的电压 * @author Mrliu * */ publicinterfaceTsocket{ publicvoid using110V(); publicvoid using220V(); }
4.2 新建一个Appliace对象
package com.liuyu.source; /** * 美国电器只能使用110V的电压工作 * @author Mrliu * */ publicclassAppliance{ publicvoid workingIn110V(){ System.out.println("=== Appliance is working in 110v ==="); } }
4.3 新建一个adapter类,继承Appliance对象,还实现了Tsocket接口
package com.liuyu.adapter; import com.liuyu.source.Appliance; import com.liuyu.target.Tsocket; /** * Adapter继承了Applance类,又实现了Tsocket接口,适配后既可以提供110V的电压,又可以提供220V的电压 * @author Mrliu * */ publicclassAdapterextendsApplianceimplementsTsocket{ @Override publicvoid using110V(){ this.workingIn110V();//调用Appliance的using110V()方法 } @Override publicvoid using220V(){ System.out.println("====经过adapter变压后,美国电器可以正常运转了 ==="); } }
4.4 主函数
import com.liuyu.adapter.Adapter; publicclassTestAdapter{ publicstaticvoid main(String[] args ){ Adapter adapter =newAdapter(); adapter.using110V(); adapter.using220V(); } }
运行结果:
5 对象适配器模式
使用一个具体类把源(Appliance-美国电器)适配到目标(Tsocket-插座)中,这样一来如果适配Appliance(美国电器)的子类,美国电器可能有带三孔插座的、带二孔插座的,这次可能适配的带二孔的,下次就要适配带三孔的。这样就很不方便了,这个时候可以把美国电器的父类作为adapter的成员变量来处理。
在类的适配器模式中,adapter是继承Appliance类的,在对象的适配器模式中,为了能适配Appliance的子类,appliance没有
作为adapter的父类来处理,而是作为adapter的成员类来处理的。现在adapter的源码如下所示:
package com.liuyu.adapter; import com.liuyu.source.Appliance; import com.liuyu.target.Tsocket; /** * Adapter继承了Applance类,又实现了Tsocket接口,适配后既可以提供110V的电压,又可以提供220V的电压 * @author Mrliu * */ publicclassAdapterimplementsTsocket{ privateApplianceappliance; //电器的父类,这里偷下懒,意思意思一下,就当做是所有美国电器的父类 publicAppliance getAppliance(){ return appliance; } publicvoid setAppliance(Appliance appliance){ this.appliance = appliance; } @Override publicvoid using110V(){ appliance.workingIn110V();//调用Appliance的using110V()方法 } @Override publicvoid using220V(){ System.out.println("====经过adapter变压后,美国电器可以正常运转了 ==="); } }
6 适配器模式的效果
(1) 一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类适配到目标接口中
(2) 与类的适配器模式相比,要置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个 源类的子类,将源类的方法置换掉,然后再把源类的子类当做真正的源类进行适配。
(3) 虽然想要置换源类的方法不容易,但是要想增加一些新的方法则方便的很,而且新增加的方法可同时适用于所有的源。
7 适配器模式的使用场景
(1) 系统需要使用现有的类,而此类的接口不符合系统的需要。
(2) 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
(3)(对对象的适配器模式而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要对每一个子类做一个适配类,而这不太实际。
相关推荐
在阅读文章《设计模式——适配器模式(adapter)》时,你可以期待了解到更多关于适配器模式的实战案例、优缺点分析以及如何在实际项目中有效利用这一模式来解决问题。同时,提供的`adapter`压缩包文件可能包含示例...
### 浅析Java设计模式【2】——适配器 #### 概念解析 适配器模式是一种常用的设计模式,其核心在于“适配”二字,即如何将一个类的接口转换成客户希望的另一个接口。该模式使得原本由于接口不兼容而不能一起工作的...
设计模式——适配器模式 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口.Adapter Pattern使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:系统数据和
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...
《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...
### 设计模式——适配器模式(Adapter Pattern) 在软件工程领域中,设计模式是一种用于解决常见问题的标准化方法。这些模式提供了一种系统化的解决方案,帮助开发人员编写出更易于理解、维护和扩展的代码。适配器...
### 设计模式——基于C#的工程化实现及扩展 #### 概述 本书旨在向读者展示如何利用C# 2.0语法有效地实现和应用设计模式,使其不仅仅局限于简单的例子,而是能够在实际工程项目中发挥重要作用。全书分为七个部分,...
在本文中,我们将重点讨论一种结构型设计模式——适配器模式(Adapter Pattern)。适配器模式的主要目标是使得原本不兼容的类能够协同工作,通过创建一个适配器来作为两个类之间的桥梁。 适配器模式通常包含两个...
比如,适配器模式允许两个不兼容的接口协同工作;桥接模式将抽象部分与实现部分分离,使它们可以独立变化;装饰模式动态地给一个对象添加一些额外的职责;外观模式提供了一个统一的接口,用来访问子系统中的多个接口...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
在《设计模式——可复用面向对象软件的基础》这本书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称GoF)首次提出了23种面向对象设计模式。这些模式涵盖了不同设计场景,如创建型模式、...
### 设计模式实验报告——适配器模式 #### 一、引言 设计模式是一种在特定情境下解决软件设计问题的通用解决方案。它为解决常见问题提供了一种可复用的设计思路,帮助开发者构建出更加灵活、易于维护的系统。在...
### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...
"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...