Java适配器模式

x33g5p2x  于2021-09-28 转载在 Java  
字(2.9k)|赞(0)|评价(0)|浏览(283)

适配器简介

适配器模式(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接口 , 这时候就需要适配器了 ,也可以叫中间件

可能了解过代理模式的 朋友会发现 适配器模式和代理模式的原理差不多啊!

那么他们的区别是什么呢

区别:很明显,适配器模式,由于旧接口不可能进行修改,因此为了还能继续使用旧接口,我们就需要将新接口利用适配器转换成旧接口

但是代理模式不一样,它使用的接口与原本接口是一样的,并未进行改变,主要功能是通过代理的这一层,能够对委托类做一些通用处理(如:日志,异常处理)。实现通用代码 和 逻辑代码分离 ,使代码耦合度降低

适配器有两种方式

  1. 属性适配器
  2. 继承适配器

在我看来 属性适配器比继承好用因为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接口中了

相关文章

微信公众号

最新文章

更多