java设计模式-适配器模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java设计模式-适配器模式
java适配器模式
1、概述
什么是适配器模式?
适配器模式是⼀种结构型设计模式。
适配器模式就是:把⼀个类的接⼝变换成客户端所期待的另⼀种接⼝,从⽽使原本因接⼝不匹配⽽⽆法在⼀起⼯作的两个类能够在⼀起⼯作。
⽤电器来打个⽐喻:有⼀个电器的插头是三脚的,⽽现有的插座是两孔的,要使插头插上插座,我们需要⼀个插头转换器,这个转换器即是适配器。
适配器模式涉及3个⾓⾊:
源(Adaptee):需要被适配的对象或类型,相当于插头。
适配器(Adapter):连接⽬标和源的中间对象,相当于插头转换器。
⽬标(Target):期待得到的⽬标,相当于插座。
2、适配器模式UML图
图⽚来⾃⽹络
通过上⾯UML图可以知道,客户端期待的接⼝或者对象通过适配器的转换得到了满⾜,Adapter通过内部包装Adaptee对象把源对象转换成客户端期待的对象。
3、适配器模式分类
适配器模式包括3种形式:
1. 类适配器模式:类适配器使⽤的是继承的⽅式,⼀般来说⽆法对其⼦类进⾏适配
2. 对象适配器模式:对象适配器使⽤的是组合的⽅式,⼦孙类都可以被适配。
另外,对象适配器对于增加⼀些新⾏为⾮常⽅便,⽽且新增加的⾏为同时适⽤
于所有的源。
3. 接⼝适配器模式(⼜称缺省适配器模式):接⼝适配器模式(缺省适配模式)基本思想是,为⼀个接⼝提供缺省实现,这样⼦类可以从这个缺省实现进⾏
扩展,⽽不必从原有接⼝进⾏扩展。
可以说对象适配器模式是另外6种结构型设计模式的起源(图⽚源⾃⽹络)。
4、三种适配器模式详解
适配器模式的三种实现⽅式及代码实例详解,⽤电器来打个⽐喻:有⼀个电器的插头是两脚的,⽽现有的插座是三孔的,要使插头插上插座,我们需要⼀个插头转换器,这个转换器即是适配器。
图⽚源⾃⽹络
4.1、类适配器模式
类适配器使⽤的是继承的⽅式,⼀般来说⽆法对其⼦类进⾏适配,请看代码实例
1.⾸先我们有⼀个要被适配的类
/**
* 源(相当于两脚插头,也就是被适配的类)
* @author ningbeibei
*/
public class Adaptee {
public void adapteeMethod() {
System.out.println("两脚插头,被适配的类....");
}
}
2.定义⼀个⽬标接⼝
/**
* ⽬标(客户所期待的类,可以是⼀个接⼝抽象类具体的类)
* 相当于三孔插板
* @author ningbeibei
*/
public interface Target {
void targetMethod();
3.定义适配器类
定义适配器类通过继承 Adaptee 和实现 Target 接⼝关联起来,
/**
* 类适配器模式(相当于转换器)
* 通过Adapter类把Adaptee类与Target接⼝衔接起来
* @author ningbeibei
*/
public class Adapter extends Adaptee implements Target {
@Override
public void targetMethod() {
//操作处理
adapteeMethod();
//操作处理
}
}
4.测试代码
/**
* 适配器模式测试类
* @author ningbeibei
*/
public class test {
public static void main(String[] args) {
//类适配器模式
Adapter adapter = new Adapter();
adapter.targetMethod();
}
}
5.运⾏结果
4.2、对象适配器模式
对象适配器使⽤的是组合的⽅式,它把源类作为属性放⼊适配器类中,请看代码实例 1.定义被适配的类
/**
* 源(相当于两脚插头,也就是被适配的类)
* @author ningbeibei
*/
public class Adaptee {
public void adapteeMethod() {
System.out.println("两脚插头,被适配的类....");
}
}
2.定义⽬标接⼝
/**
* ⽬标(客户所期待的类,可以是⼀个接⼝抽象类具体的类)
* 相当于三孔插板
* @author ningbeibei
*/
public interface Target {
void targetMethod();
}
3.定义适配器类(类似于转换器)
注意:通过持有Adaptee属性建⽴与Target接⼝联系
/**
* 对象适配器模式(相当于转换器)
* 通过持有Adaptee属性建⽴与Target接⼝联系
* @author ningbeibei
*/
public class Adapter implements Target {
//添加属性
private Adaptee adaptee;
public Adapter (Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void targetMethod() {
//操作处理
adaptee.adapteeMethod();
//操作处理
}
4.测试类
/**
* 适配器模式测试类
* @author ningbeibei
*/
public class test {
public static void main(String[] args) {
//对象适配器模式
Adapter adapter = new Adapter(new Adaptee());
adapter.targetMethod();
}
}
5.结果输出
4.3、接⼝适配器模式(缺省适配模式)
接⼝适配器模式⼜称缺省模式,这种模式通过抽象类对接⼝进⾏实现,在抽象类种对接⼝进⾏默认实现。
请看下⾯代码⽰例
1.定义顶层接⼝
/**
* 定义顶层接⼝
* @author ningbeibei
*/
public interface Target {
void targetMethod();
void targetMethod1();
void targetMethod2();
}
2.定义抽象类 AbstrctAdapter 并实现 Target 接⼝
/**
* 接⼝适配器模式
* 定义抽象类并实现Target接⼝
* @author ningbeibei
*/
public abstract class AbstrctAdapter implements Target {
//默认实现⽅法
public void targetMethod() {
System.out.println("默认实现");
};
//需要⼦类必须实现的⽅法
public abstract void targetMethod1();
//需要⼦类重写这个⽅法
public void targetMethod2() {
System.out.println("默认实现2");
};
}
3.定义Adapter类并继承AbstrctAdapte抽象类
通过接⼝和抽象类的结合,避免了在实现接⼝的⼦类中出现⼤量的“⽆意义”实现,这个“⽆意义”实现,被缓冲到了抽象类中,完美展现了代码复⽤(可以把抽象类理解成接⼝和实现类之间的缓冲)
/**
* 通过继承AbstrctAdapter抽象类
* 实现它的抽象⽅法和重写⽅法
* 这种⽅式是通过抽象类缓冲接⼝中那些我们不想实现的空⽅法
* @author ningbeibei
*/
public class Adapter extends AbstrctAdapter {
@Override
public void targetMethod1() {
System.out.println("⼦类必须实现");
}
public void targetMethod2() {
System.out.println("重写实现2");
};
}
4.测试类
/**
* 缺省模式
* @author ningbeibei
public class test {
public static void main(String[] args) {
Adapter adapter = new Adapter();
adapter.targetMethod();
adapter.targetMethod1();
adapter.targetMethod2();
}
}
5.结果输出
通过上⾯结果输出我们可以得道以下⼏点:
1. 提供⽅法默认实现
2. 决定⼦类必须要实现⽅法
3. ⼦类可以决定是否重新⽗类⽅法
4. 通过接⼝和抽象类的结合,避免了在实现接⼝的⼦类中出现⼤量的“⽆意义”实现,这个“⽆意义”实现,被缓冲到了抽象类中
5、适配器模式的优缺点
5.1、优点
更好的复⽤性:系统需要使⽤现有的类,⽽此类的接⼝不符合系统的需要。
那么通过适配器模式就可以让这些功能得到更好的复⽤。
更好的扩展性:在实现适配器功能的时候,可以扩展⾃⼰源的⾏为(增加⽅法),从⽽⾃然地扩展系统的功能。
5.2、缺点
会导致系统紊乱:滥⽤适配器,会让系统变得⾮常零乱。
例如,明明看到调⽤的是A接⼝,其实内部被适配成了B接⼝的实现,⼀个系统如果太多出现这种情况,⽆异于⼀场灾难。
因此如果不是很有必要,可以不使⽤适配器,⽽是直接对系统进⾏重构。