6.适配器模式
- 创建模式-new对象
- 结构型-从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题
6.1 介绍
- 将一个类的接口转换为用户需要的另一个接口。两个接口没关系。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 角色分析
目标接口:客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
需要适配的类:需要适配的类或适配者类
适配器:通过包装一个需要适配的对象,把员接口转换问目标对象
6.2 举例理解
- 手机要利用投影仪投影,但数据线直接连不上,需要一个适配器来转换
- 类适配器的思想:手机连接一个实现了投影功能的适配器
//手机
public class Phone {
//手机投影
public void projectionRequset(Adapter adapter){
System.out.println("手机需要投影功能");
adapter.handlerRequest();
}
}
//投影仪
public class Projector {
public void projection(){
System.out.println("投影仪实现投影");
}
}
//投影适配器
public interface Adapter {
public void handlerRequest();
}
/*
* 继承关系:类适配器(单继承)
* 组合关系:对象适配器,常用
* */
public class netAdapter extends Projector implements Adapter{
@Override
public void handlerRequest() {
super.projection();
}
}
- 测试
@Test
public void testAdataper(){
Phone phone = new Phone();
//手机连适配器,适配器自己继承了投影仪投影功能
//不符合适配器常规思想
phone.projectionRequset(new netAdapter());
}
- 对象适配器思想:视配器可以连接不同的投影仪,手机连接适配器即可实现投影
//组合关系
public class netAdapter2 implements Adapter{
private Projector projection;
public netAdapter2(Projector projection) {
this.projection = projection;
}
@Override
public void handlerRequest() {
projection.projection();
}
}
- 测试
@Test
public void testAdataper02(){
Phone phone = new Phone();
Projector projector = new Projector();
//适配器连投影仪
netAdapter2 netAdapter2 = new netAdapter2(projector);
//手机连适配器
phone.projectionRequset(netAdapter2);
}
6.3 应用场景
-
实际使用:USB网线转换器
-
JUI编程中动作监听器适配器的使用
-
系统需要使用一些现有的类,这些类的接口和方法名不符合系统需要,或者是没有这些类的源码
-
创建一个可以重复使用的类,用于与彼此之间没有太大关联的一些类,包括一些可能在将来引进的类协同工作。
-
字节转字符流
InputStreamReader(new FileInputStream("path"));
- springmvc中核心分发器->处理器映射器
- 新旧系统升级改造时适配旧的类
6.4 优缺点
- 对象适配器的有点:
一个对象适配器可以把多个不同的适配者适配到同一个目标
可以适配一个适配者子类,由于适配器和适配者是关联关系,从“里氏代换原则”看,适配者子类同样能通过适配器来适配
- 类适配器的缺点
对于java,c#等单继承语言,一次只能适配一个适配者类
对于这些语言,适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定局限性。
本专栏下一篇:设计模式之桥接模式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123929.html