概述
第一次见到适配器模式的时候,很佩服为设计模式命名的人,因为他们真的很符合这个名字,做到了见名知意;
概述:
在我们的开发中业务会经常的变化,接口也会做出相应的改变,而这些又是我们不得不去面对的事情,这个时候我们可以用到适配器这个模式,他将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于不兼容而不能一起工作的哪些类可以一起工作;
适配器角色:
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
适配器的经典实现:
适配器是英语Adapter/adaptor的汉语翻译。适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。
结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示:
对象匹配器依赖于对象组合,如下图所示:
实例:
假设我们最开始设计了一个安卓的充电器,后来我们想让这个接口也可以满足Iphone充电器怎么办啦
针对这样的兼容性决办法就是创建一个适配器(Adapter)。
类适配器使用的是继承:
/**
* 类适配器模式
* @author lyg
*
*/
/**
* 目标角色
* @version 2.0
*/
interface Target {
/*/
* 充电器接口
*/
public void charger(String type);
}
/**
* 源角色:被适配的角色
* @version 2.0
*/
class Adaptee{
public void PhoneCharger(){
System.out.println("我是一个iphone充电器");
}
}
/**
* 类适配器角色
*/
class Adapter extends Adaptee implements Target{
@Override
public void charger(String type) {
if("android".equals(type)){
System.out.println("我是一个安卓充电器");
}
if("Iphone".equals(type)){
PhoneCharger();
}
}
}
public class Test {
/*/
* main方法,模拟客户端调用
*/
public static void main(String[] args) {
Adapter adapter=new Adapter();
adapter.charger("Iphone");
}
}
这样以后,以后如果程序再变动,我们也可以只需要增加适配器角色就可以满足需求;
对象适配器使用的是委派:
/**
* 类适配器模式
* @author lyg
*
*/
/**
* 目标角色
* @version 2.0
*/
interface Target {
/*/
* 充电器接口
*/
public void charger(String type);
}
/**
* 源角色:被适配的角色
* @version 2.0
*/
class Adaptee{
public void PhoneCharger(){
System.out.println("我是一个iphone充电器");
}
}
/**
* 类适配器角色
*/
class Adapter implements Target{
public Adaptee adaptee;
@Override
public void charger(String type) {
if("android".equals(type)){
System.out.println("我是一个安卓充电器");
}
if("Iphone".equals(type)){
adaptee.PhoneCharger();
}
}
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
public class Test {
/*/
* main方法,模拟客户端调用
*/
public static void main(String[] args) {
Adaptee adaptee=new Adaptee();
Adapter adapter=new Adapter(adaptee);
adapter.charger("Iphone");
}
}
如例中代码所示,你可以运用适配器(Adapter)模式来避免因外部库改变所带来的不便——倘若向上兼容。作为某个库的开发者,你应该独立编写适配器,使你的用户更简便地使用新版本的库,而不用去修改他们现有的全部代码。
GoF书中提出的适配器(Adapter)模式更倾向于运用继承而不是组成。这在强类型语言中是有利的,因为适配器(Adapter)事实上是一个目标类的子类,因而能更好地与类中方法相结合。
模式总结
优点
1 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
2 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
3 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
4 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
2 缺点
对于对象适配器来说,更换适配器的实现过程比较复杂。
3 适用场景
3.1 系统需要使用现有的类,而这些类的接口不符合系统的接口。
3.2 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3.3 两个类所做的事情相同或相似,但是具有不同接口的时候。
3.4 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
3.5 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
适配器应用举例
1 使用过ADO.NET的开发人员应该都用过DataAdapter,它就是用作DataSet和数据源之间的适配器。DataAdapter通过映射Fill和Update来提供这一适配器。
2 手机电源适配器
最后
以上就是儒雅小懒猪为你收集整理的Java设计模式之适配器模式Adapter(结构型)概述:适配器角色:结构实例: 模式总结 适配器应用举例的全部内容,希望文章能够帮你解决Java设计模式之适配器模式Adapter(结构型)概述:适配器角色:结构实例: 模式总结 适配器应用举例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复