首页 > 代码库 > 设计模式 之 适配器

设计模式 之 适配器

适配器模式(Adapter)
          将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


    在我们生活中存在很多适配器的例子,如插座转换器、笔记本电脑电源适配器等。今天,我们就来看一下嘴熟悉的笔记本电源适配器的例子。通常,笔记本电脑需要的电流都是12-20V以内的直流电流,而我们家庭用电通常是220V的交流电,当然还有工业用电380V交流电,还有更低的110V交流电源。如何把这些不同的交流电源转换成笔记本电脑需要的直流电呢?这就需要电源适配器。

                                                              

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 适配器
{
    //电源基类
    public class BasePower
    {
        //电压值
        private float power;
        //单位
        private string unit = "V";
        //构造方法
        public BasePower(float power)
        {
            this.power = power;
        }

        public float Power
        {
            get { return power; }
            set { power = value; }
        }

        public string Unit
        {
            get { return unit; }
            set { unit = value; }
        }


    }
    //交流电源接口
    public interface IPower
    {
        //输出交流电
        void output();
    }

    //交流电源
    public class Power : BasePower,IPower 
    {
        //构造方法
        public Power(float power) : base(power) { }
        //电源输出
        public void output()
        {
            Console.WriteLine("这是" + this.Power + this.Unit + "交流电源!");
        }
    }

    //12V直流电源接口
    public interface IPower12
    {
        void output12v();
    }

    //12V直流电源
    public class Power12 : BasePower,IPower12 
    {
        public Power12(float power) : base(power) { }
        public void output12v()
        {
            Console.WriteLine("这是" + this.Power + this.Unit + "直流电源!");
        }
    }

    //电源适配器(实现目标对象接口,即12V电源接口)
    public class AdapterPower12 :IPower12 
    {
        //待转换的交流电源
        private BasePower basePower;

        //适配器构造方法,将待转换对象传入
        public AdapterPower12 (BasePower basePower)
        {
            this.basePower = basePower;
        }
        //实现目标对象方法
        public void output12v()
        {
            //获得外部电源值
            float powerFloat = this.basePower.Power;
            //进行电源转换
            if (powerFloat == 380)
            {
                //380V电源转换
                powerFloat = powerFloat / 31.67f;
            }
            else if (powerFloat == 220)
            {
                //220V电源转换
                powerFloat = powerFloat / 18.33f;
            }
            else if(powerFloat==110)
            {
                //110V电源转换
                powerFloat = powerFloat / 9.17f;
            }
            else
            {
                Console.WriteLine("不能适配电源!");
                return;
            }

            powerFloat = (int)(powerFloat * 10) / 10.0f;
            Console.WriteLine("这是" + powerFloat + this.basePower.Unit + "直流电源!");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //首先生成一个220V电源对象!
            Power power220 = new Power(220);
            power220.output();

            //生成一个12V电源对象
            IPower12 power12 = new Power12(12);
            power12.output12v();

            Console.WriteLine();

            //使用电源适配器将220V电源转换成12V电源
            Console.WriteLine("电源适配器转换中");
            IPower12 adapterPower12 = new AdapterPower12(power220);
            adapterPower12.output12v();
            Console.WriteLine("电源适配器转换结束!");
        }
    }
}



适配器的类图


                


    在对象适配器模式结构图中包含如下几个角色:
           Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
           Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
           Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。


主要优点:
       1.将目标类和适配者类解耦
       2.增加了类的透明度和复用性
       3.灵活性好和扩展性好


使用场合:
       1.软件系统结构需要升级或扩展,又不想影响原有系统的稳定运行的时候
       2.转换类之间的差别不是太大的时候

       3.想创建一个可以复用的类,该类可以与其他不想管的类或不可预见的类协同工作的时候


       适配器主要用于系统的升级扩展,或者版本兼容性上,没有哪一个系统分析师会在软件设计阶段使用适配器模式的。适配器可以很好的解决版本兼容问题。另外,就是原有类和新的接口标准不能差别太大,否则,适配器是达不到预期效果的。适配器在软件的后期维护中具有很大的优势,它不仅能保持原有系统的稳定,而且还能进行新功能的扩展。



与桥接和装饰的区别
    1.与桥接的区别:适配器是将一种接口转换为另一种接口的设计模式,而桥接则是把实现和它的接口分开,以便它们可以独立地变化。桥接并不是用来把一个已有的对象接到不相匹配的接口上的。

    2.与装饰的区别:适配器主要用来填补两个接口之间的差异,而装饰则是不需要更改接口,就可以新增功能的设计模式。





设计模式 之 适配器