适配器模式(Adapter)

简介: 一 概述定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。

一 概述

定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。

属于结构型模式

主要分为三类:类适配器模式、对象的适配器模式、接口的适配器模式。

本文定义:

需要被适配的类、接口、对象(我们有的),简称 src(source)
最终需要的输出(我们想要的),简称 dst (destination,即Target)
适配器称之为 Adapter

一句话描述适配器模式的感觉: src->Adapter->dst,即src以某种形式(三种形式分别对应三种适配器模式)给到Adapter里,最终转化成了dst。

使用场景:

1 系统需要使用现有的类,而这些类的接口不符合系统的需要。
2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3 需要一个统一的输出接口,而输入端的类型不可预知。

二 类适配器模式

一句话描述:Adapter类,通过继承 src类,实现 dst 类接口,完成src->dst的适配。
我们通过一个最常用的例子来说明
生活中最常见的就是充电器,220V的交流电被转换成5V的直流电,充电器在其中就担当了适配器的功能

既然我们是进行适配,那就说明是基于某一个功能点的实现,所以我们先定义一个输出220v交流电的功能,这个功能如下

    /// <summary>
    /// 220V电压
    /// </summary>
    public class Voltage220
    {
        public int output220v()
        {
            int src = 220;
            Console.WriteLine("我是" + src + "伏电压");
            return src;
        }
    }  

定义一个接口,接口的方法签名是转换(220V-5V)

    /// <summary>
    /// 客户需要的5V电压接口
    /// </summary>
    public interface Voltage5
    {
        /// <summary>
        /// 输出5V
        /// </summary>
        /// <returns></returns>
        int output5v();
    }

接下去我们开始定义适配器类
!!!注意点
1、继承后来的类
2、实现适配器接口

    /// <summary>
    /// 类适配器
    /// </summary>
    public class VoltageAdapter : Voltage220, Voltage5
    {
        public int output5v()
        {
            int src = new Voltage220().output220v();
            Console.WriteLine("适配器工作开始适配电压");
            int dst = src / 44;
            Console.WriteLine("适配完成后输出电压:" + dst);
            return dst;
        }
    }

此时我们需要一个设备,使用适配器查看功能是否正确
定义一个手机类,实现转换功能
Mobile.charging(适配器 box1)
实例化手机,调用充电方法,形参是适配器的实例

  /// <summary>
    /// 手机类
    /// </summary>
    public class Mobile
    {
        /// <summary>
        /// 充电方法
        /// </summary>
        /// <param name="voltage5"></param>
        public void charging(Voltage5 voltage5)
        {
            if (voltage5.output5v() == 5)
            {
                Console.WriteLine("电压刚刚好5V,开始充电");
            }
            else if (voltage5.output5v() > 5)
            {
                Console.WriteLine("电压超过5V,都闪开 我要变成note7了");
            }
        }
    }

功能实现

        /// <summary>
        /// 类适配器
        /// </summary>
        public static void ClassStart()
        {
            Console.WriteLine("===============类适配器==============");
            Mobile mobile = new Mobile();
            mobile.charging(new VoltageAdapter());
        }

三 对象适配器

基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承src类,而是持有src类的实例,以解决兼容性的问题。
即:持有 src类,实现 dst 类接口,完成src->dst的适配。
(根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。)

    /// <summary>
    /// 对象适配器
    /// </summary>
    public class VoltageAdapter2 : Voltage5
    {
        private Voltage220 voltage220;

        public VoltageAdapter2(Voltage220 voltage220)
        {
            this.voltage220 = voltage220;
        }

        public int output5v()
        {
            int dst = 0;
            if (null != voltage220)
            {
                int src = voltage220.output220v();
                Console.WriteLine("对象适配器工作,开始适配电压");
                dst = src / 44;
                Console.WriteLine("适配完成后输出电压:" + dst);
            }
            return dst;
        }
    }

功能实现

      /// <summary>
        /// 对象适配器
        /// </summary>
        public static void ObjectStart()
        {
            Console.WriteLine("===============对象适配器==============");
            VoltageAdapter2 voltageAdapter2=new VoltageAdapter2(new Voltage220());
            Mobile mobile = new Mobile();
            mobile.charging(voltageAdapter2);
        }

小结:

对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。
根据合成复用原则,组合大于继承,
所以它解决了类适配器必须继承src的局限性问题,也不再强求dst必须是接口。
同样的它使用成本更低,更灵活

目录
相关文章
|
12月前
|
设计模式 Java 数据库连接
Java设计模式-适配器模式(Adapter)
Java设计模式-适配器模式(Adapter)
|
Java 程序员 API
结构型模式 - 适配器模式(Adapter Pattern)
结构型模式 - 适配器模式(Adapter Pattern)
|
设计模式 Java
浅析Java设计模式【2.2】——适配器
Java常用设计模式,适配器模式
66 0
浅析Java设计模式【2.2】——适配器
|
设计模式
结构型-Adapter
适配器模式的原理与实现 适配器模式 的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。 原理很简单,我们再来看下它的代码实现。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。具体的代码实现如下所示。其中,ITarget 表示要转化成的接口定义。Adaptee 是一组不兼容 ITa
94 0
结构型-Adapter
|
设计模式 Java
浅谈JAVA设计模式之——适配器模式(Adapter
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
181 0
浅谈JAVA设计模式之——适配器模式(Adapter