适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
先看一段代码
public void show(Usb_Inter usb){
usb.start();
}
从这个方中我们可以看出来 参数必须传入 Usb接口/他的实现类
笔记本电脑的usb接口只能插入usb接口的设备,现在我想把非usb接口的投影器插进去怎么办呢? 可以用一个适配器 看图
因为连个接口不一致导致无法使用投影器,而我们想使用USB接口的服务,就应该把投影器接口转换USB接口 , 这时候就需要适配器了 ,也可以叫中间件
可能了解过代理模式的 朋友会发现 适配器模式和代理模式的原理差不多啊!
那么他们的区别是什么呢
区别:很明显,适配器模式,由于旧接口不可能进行修改,因此为了还能继续使用旧接口,我们就需要将新接口利用适配器转换成旧接口
但是代理模式不一样,它使用的接口与原本接口是一样的,并未进行改变,主要功能是通过代理的这一层,能够对委托类做一些通用处理(如:日志,异常处理)。实现通用代码 和 逻辑代码分离 ,使代码耦合度降低
适配器有两种方式
在我看来 属性适配器比继承好用因为java是单继承 如果我要适配多设备呢 岂不是要创建多个适配器?
适配器模式是一种补救模式,典型的应用场景就是我们开发好的程序,由于考虑不周到,或者需求变更,需求升级,需要修改某些接口,这时候可以使用适配器模式让我们的系统只需要最少的修改,带来最小的影响。
public interface Usb_Inter { //电脑的Usb接口
void start();//启动设备
}
public class Mouse implements Usb_Inter {//鼠标
@Override
public void start() {
System.out.println("鼠标连接成功了");
}
}
public class test {
//调用接口方法
public void show(Usb_Inter usb){
usb.start();
}
@Test
public void show1(){
show(new Mouse()) ;
}
}
鼠标连接成功了
这时候我需要连接投影器 因为接口不同所以我们需要写一个适配器让他们接口相同 能传入show(Usb_Inter usb) 参数里
public interface Projector_Inter {//投影器 接口
void Pro_start();//投影器启动
}
public class Projector implements Projector_Inter {
@Override
public void Pro_start() {
System.out.println("投影器连接成功");
}
}
适配器:
public class Adapter implements Usb_Inter { //适配器
private Projector projector;
public Adapter(Projector projector) {
this.projector = projector;
}
@Override
public void start() {
if (projector!=null){
projector.Pro_start();
}
}
}
public class test {
//调用接口方法
public void show(Usb_Inter usb){
usb.start();
}
@Test
public void show2(){
show(new Adapter(new Projector()));
}
}
投影器连接成功
看出来了没 成功的将非Usb接口的设备关联到Usb接口中了
尽量不要使用 继承适配器 因为 java是单继承 如果后期需要继承父类 那么就麻烦了
和属性的原理一样
public interface Usb_Inter { //电脑的Usb接口
public void start();//启动设备
}
public class Mouse implements Usb_Inter {//鼠标
@Override
public void start() {
System.out.println("鼠标连接成功了");
}
}
public class test {
//调用接口方法
public void show(Usb_Inter usb){
usb.start();
}
@Test
public void show1(){
show(new Mouse()) ;
}
}
鼠标连接成功了
这时候我需要连接投影器 因为接口不同所以我们需要写一个适配器让他们接口相同能传入show(Usb_Inter usb) 参数里
public interface Projector_Inter {//投影器 接口
public void Pro_start();//投影器启动
}
public class Projector implements Projector_Inter {
@Override
public void Pro_start() {
System.out.println("投影器连接成功");
}
}
适配器:
public class Adapter_projector extends Projector implements Usb_Inter { //投影器
@Override
public void start() {
super.Pro_start();
}
}
public class test {
//调用接口方法
public void show(Usb_Inter usb){
usb.start();
}
@Test
public void show2(){
show(new Adapter(new Projector()));
}
}
投影器连接成功
看出来了没 成功的将非Usb接口的设备关联到Usb接口中了
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/120238884
内容来源于网络,如有侵权,请联系作者删除!