对象适配器设计模式——我的理解
当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后在适配器P中定义私有变量C(对象)(B接口指向变量名),再定义一个带参数的构造器用来为对象C赋值,再在A接口的方法实现中使用对象C调用其来源于B接口的方法。
- 简单点理解就是平常所见的转接头,转换器之类的存在。就是我一定要用A插头,A插头却不匹配B插口,于是,搞一个转接头来,依然先通过A插头供电,经过转接头,适配一个B插头,这样就解决了冲突。
对象适配器采用的是对象组合(适配器包装被适配对象)的关系,不是使用继承关系,被适配的类的API转换成为目标类的API。
结构和图解
图解
结构
角色 | 作用 |
---|---|
Target(目标抽象类) | 目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。 |
Adaptee(适配者类) | 适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。 |
Adapter(适配器类) | 适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。 |
实例源码
- 实例
我手中有个Micro USB插头的U盘,但是手机上只有Type-C插头的接口,怎么办呢?弄个转换器,将Micro USB插头转换成为Type-C插头就可以使用了。
接口Micro USB(目标抽象):描述Micro USB接口格式
接口Type-C(适配者抽象):描述Type-C接口格式
类Usber(具体适配者):是接口Type-C的实现类,是具体的Type-C接口格式
Adapter(适配器):用于将Micro USB接口格式转换成为Type-C接口格式
- MicroUSB接口:MicroUSB
public interface MicroUSB {
void useMicroUSB();
}
- TypeC接口:TypeC
public interface TypeC {
void useTypeC();
}
- TypeC接口实现类:TypeCUsber
public class TypeCUsber implements TypeC {
@Override
public void useTypeC() {
System.out.println("TypeC插头");
}
}
- 适配器:Adapter
public class Adapter implements MicroUSB {
private TypeC typeC;
public Adapter(TypeC typeC){
this.TypeC = typeC;
}
@Override
public void useMicroUSB() {
typeC.useTypeC();
}
}
- 测试类:Clienter
public class Clienter {
public static void main(String[] args) {
// 我只有一个TypeC插头的U盘
// 但是,手机的插口是Micro USB的
TypeC typeC = new TypeC();
// 使用适配器,将TypeC插头转换为Micro USB插头
MicroUSB p = new Adapter(typeC);
// 使用转换后的Micro USB插头
p.useMicroUSB();
}
}
优缺点
- 优点
一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。
符合设计原则:多用合成/聚合、少用继承,从而减少类之间的耦合.
- 缺点
需要额外的引用来间接得到Adaptee。
适用场景
(1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
(2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。
想了解更多,欢迎前来关注
如果觉得不错,来关注吧
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69798.html