• 5 结构型模式之


    适配器模式的介绍:适配器模式在开发中使用率很高,适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能够协作起来。例如经常碰到两个不相关的类之间进行交互,第一个解决方案是修改各自类的接口,但是如果没有源码或者我们不愿意为了一个应用而修改各自的接口,此时怎么办?这种情况我们往往会使用一个Adapter,在这两种接口之间创建一个“混血儿”接口,这个Adapter会将这两个接口兼容,在不修改源码的情况下满足需求。

    适配器模式的定义:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能在一起工作

    适配器使用场景:

    1 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容

    2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作

    3 需要一个统一的输出接口,而输入端的类型不可预知

    用电源接口做例子,笔记本电脑的电源一般都是5V电压,但是我们生活中的电线电压一般都是220V,这个时候就出现了不匹配的情况,不软件开发中我们称之为接口不兼容,此时就需要适配器来进行一个接口转换,在软件开发中有一句话正好体现了这点:任何问题都可以加一个中间层来解决。这个层我们可以理解为这里的Adapter层,通过这层来进行一个接口转换就达到了兼容的目的。

    适配器模式分分两种:

    1)类适配器模式

    2) 对象适配器模式

    先说第一种类适配器模式:

    5V电压的接口,代码如下:

    1 /**
    2  * Target角色,就是要转换成的5V的
    3  */
    4 public interface FiveVolt {
    5     int getVolt5();
    6 }

    220V的电压,需要被转换的

    1 /**
    2  * 220V的电压,被转换的类
    3  */
    4 public class Volt220 {
    5     public int getVolt220(){
    6         return 220;
    7     }
    8 }

    下面是Adapter角色,将220V的电压转换成5V的电压

    1 /**
    2  * 适配器,即有5V的,又有220V的,就像转换头一样,两边都可以兼容
    3  */
    4 public class ClassVoltAdapter extends Volt220 implements FiveVolt {
    5     @Override
    6     public int getVolt5() {
    7         return 5;
    8     }
    9 }

    看到没,上面的ClassVoltAdapter里面即有220V的,又有5V的,需要5V的也可以用,需要220V的也可以用。

    下面是类适配器模式的测试类:

     1 /**
     2  * 下面是类适配器模式的测试类
     3  */
     4 public class ClassAdapterTest {
     5     public static void main(String[] args){
     6         test();
     7     }
     8 
     9     public static void test(){
    10 
    11         ClassVoltAdapter voltAdapter = new ClassVoltAdapter();
    12         System.out.println(voltAdapter.getVolt5());
    13 
    14     }
    15 
    16 }

    下面再来看看第二种适配器模式:对象适配器模式

    首先前面的 5V的接口和220V的类还是一样的。这里只是把代码贴出来供方便查看的。

    5V电压的接口,代码如下:

    1 /**
    2  * Target角色,就是要转换成的5V的
    3  */
    4 public interface FiveVolt {
    5     int getVolt5();
    6 }

    220V的电压类

    /**
     * 220V的电压,被转换的类
     */
    public class Volt220 {
        public int getVolt220(){
            return 220;
        }
    }

    下面看一下对象适配器类:主要是实现了目标接口,并且保存了一个被转换的类的对象的引用 ,代码如下:

     1 /**
     2  * 对象适配器,实现目标接口,保存一个被转换对象的引用
     3  */
     4 public class ObjectVoltAdapter implements FiveVolt{
     5     //保存一个被转换对象的引用
     6     Volt220 volt220;
     7 
     8     public ObjectVoltAdapter(Volt220 volt220){
     9         this.volt220 = volt220;
    10     }
    11 
    12     @Override
    13     public int getVolt5() {
    14         return 5;
    15     }
    16 
    17     public int getVolt220(){
    18         return volt220.getVolt220();
    19     }
    20 }

    下面是对象适配器模式测试类:

     1 /**
     2  * 对象适配器的测试类
     3  */
     4 public class ObjectVoltAdapterTest {
     5     public static void main(String[] args){
     6         test();
     7     }
     8 
     9     public static void test(){
    10         //创建一个220V的电压类的对象,也就是被转换的类的对象
    11         Volt220 volt220 = new Volt220();
    12         //创建一个对象适配器类的对象,并且保存一个被转换的类的对象
    13         ObjectVoltAdapter voltAdapter = new ObjectVoltAdapter(volt220);
    14         System.out.println(voltAdapter.getVolt5());
    15     }
    16 }
  • 相关阅读:
    govendor用法
    java.util.DualPivotQuickSort的实现
    windows注册表
    一道正则表达式题目
    JDK10、JDK11、JDK12新特性
    初夏清晨有所思
    Java 9新特性
    sklearn聚类评价指标
    沉浸式和全局式
    [抄]外部奖励对内在动机的侵蚀
  • 原文地址:https://www.cnblogs.com/start1225/p/6770532.html
Copyright © 2020-2023  润新知