设计模式之-适配器模式

定义:

适配器模式(Adapter Pattern) :将一个接口转换成客户但愿的另外一个接口,适配器模式使接口不兼容的那些类能够一块儿工做,其别名为包装器(Wrapper)。适配器模式既能够做为类结构型模式,也能够做为对象结构型模式。git

适配器模式参与者

  • Target:客户(Client)所期待的接口。目标能够是具体的或抽象的类,也能够是接口。
  • Adapter:经过在内部包装一个Adaptee对象,把源接口转换成目标接口。
  • Adaptee:须要适配的类

适配器模式基本代码

1.类适配器结构实现

Target类:github

namespace AdapterPattern.BasicStructure.ClassAdapter
{
    /// <summary>
    /// 接口
    /// </summary>
    interface ITarget
    {
        void Request();
    }
}

Adapter类:编程

namespace AdapterPattern.BasicStructure.ClassAdapter
{
    class Adapter : Adaptee, ITarget
    {
        public void Request()
        {
            this.SpecificRequest();
        }
    }
}

Adaptee类:app

namespace AdapterPattern.BasicStructure.ClassAdapter
{
    /// <summary>
    /// 须要要适配的类
    /// </summary>
    class Adaptee
    {
        /// <summary>
        /// 特殊的请求
        /// </summary>
        public void SpecificRequest()
        {
            Console.WriteLine("特殊请求!");
        }
    }
}

客户端调用代码:编程语言

    static void Main(string[] args)
    {
        try
        {
            {//BasicStructure-ClassAdapter
                BasicStructure.ClassAdapter.ITarget target = new BasicStructure.ClassAdapter.Adapter();
                //表面看像是调用了Request()方法,但实际是调用了SpecificRequest()方法
                target.Request();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

结果以下:this

2.对象适配器结构实现

 Target类;spa

namespace AdapterPattern.BasicStructure.ObjectAdapter
{
    /// <summary>
    /// 接口
    /// </summary>
    interface ITarget
    {
        void Request();
    }
}

Adapter类:code

namespace AdapterPattern.BasicStructure.ObjectAdapter
{
    class Adapter : ITarget
    {
        private Adaptee _adaptee = new Adaptee();

        public void Request()
        {
            _adaptee.SpecificRequest();
        }
    }
}

Adaptee类:orm

namespace AdapterPattern.BasicStructure.ObjectAdapter
{
    /// <summary>
    /// 须要要适配的类
    /// </summary>
    class Adaptee
    {
        /// <summary>
        /// 特殊的请求
        /// </summary>
        public void SpecificRequest()
        {
            Console.WriteLine("特殊请求!");
        }
    }
}

客户端调用代码:对象

    static void Main(string[] args)
    {
        try
        {
            {//BasicStructure-ObjectAdapter
                BasicStructure.ObjectAdapter.ITarget target = new BasicStructure.ObjectAdapter.Adapter();
                target.Request();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

结果以下:

用适配器模式实现笔记本电脑获取电压

场景模拟:以笔记本电脑要用220V的电压为例

1.类适配器结构实现

Computer(电脑)类——Target类

namespace AdapterPattern.SituationSimulation.ClassAdapter
{
    /// <summary>
    /// 接口
    /// </summary>
    interface IComputer
    {
        void GetVoltage();
    }
}

Transformer(变压器)类——Adapter类

namespace AdapterPattern.SituationSimulation.ClassAdapter
{
    /// <summary>
    /// 变压器
    /// </summary>
    class Transformer : NoteBook, IComputer
    {
        public void GetVoltage()
        {
            this.Get220Voltage();
        }
    }
}

NoteBook(笔记本)类——Adaptee类

namespace AdapterPattern.SituationSimulation.ClassAdapter
{
    /// <summary>
    /// 笔记本电脑类
    /// </summary>
    class NoteBook
    {
        /// <summary>
        /// 获取220V 电压
        /// 系统中已经存在的类,与ITarget接口不兼容,又很差修改这个类
        /// </summary>
        public void Get220Voltage()
        {
            Console.WriteLine("我要使用220V 电压才能正常工做!");
        }
    }
}

客户端调用代码:

    static void Main(string[] args)
    {
        try
        {
            {//SituationSimulation-ClassAdapter
                SituationSimulation.ClassAdapter.IComputer target = new SituationSimulation.ClassAdapter.Transformer();
                target.GetVoltage();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

结果以下:

2.对象适配器结构实现

Computer(电脑)类——Target类

namespace AdapterPattern.SituationSimulation.ObjectAdapter
{
    /// <summary>
    /// 接口
    /// </summary>
    interface IComputer
    {
        void GetVoltage();
    }
}

Transformer(变压器)类——Adapter类

namespace AdapterPattern.SituationSimulation.ObjectAdapter
{
    /// <summary>
    /// 变压器
    /// </summary>
    class Transformer :  IComputer
    {
        private NoteBook _noteBook = new NoteBook();
        public void GetVoltage()
        {
            _noteBook.Get220Voltage();
        }
    }
}

NoteBook(笔记本)类——Adaptee类

namespace AdapterPattern.SituationSimulation.ObjectAdapter
{
    /// <summary>
    /// 笔记本电脑类
    /// </summary>
    class NoteBook
    {
        /// <summary>
        /// 获取220V 电压
        /// 系统中已经存在的类,与ITarget接口不兼容,又很差修改这个类
        /// </summary>
        public void Get220Voltage()
        {
            Console.WriteLine("我要使用220V 电压才能正常工做!");
        }
    }
}

客户端调用代码:

    static void Main(string[] args)
    {
        try
        {
            {//SituationSimulation-ObjectAdapter
                SituationSimulation.ObjectAdapter.IComputer target = new SituationSimulation.ObjectAdapter.Transformer();
                target.GetVoltage();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

结果以下:

优势:

  • 将目标类和适配者类解耦,经过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
  • 增长了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来讲是透明的,并且提升了适配者的复用性。
  • 灵活性和扩展性都很是好,经过使用配置文件,能够很方便地更换适配器,也能够在不修改原有代码的基础上增长新的适配器类,彻底符合“开闭原则”。

类适配器模式还具备以下优势:

  因为适配器类是适配者类的子类,所以能够在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

对象适配器模式还具备以下优势:

  一个对象适配器能够把多个不一样的适配者适配到同一个目标,也就是说,同一个适配器能够把适配者类和它的子类都适配到目标接口。

缺点:

类适配器模式的缺点以下:

对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,并且目标抽象类只能为抽象类,不能为具体类,其使用有必定的局限性,不能将一个适配者类和它的子类都适配到目标接口。

对象适配器模式的缺点以下:

与类适配器模式相比,要想置换适配者类的方法就不容易。若是必定要置换掉适配者类的一个或多个方法,就只好先作一个适配者类的子类,将适配者类的方法置换掉,而后再把适配者类的子类当作真正的适配者进行适配,实现过程较为复杂。

适用环境:

在如下状况下可使用适配器模式:

  • 系统须要使用现有的类,而这些类的接口不符合系统的须要。
  • 想要创建一个能够重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在未来引进的类一块儿工做。

总结:

  • 结构型模式描述如何将类或者对象结合在一块儿造成更大的结构。
  • 适配器模式用于将一个接口转换成客户但愿的另外一个接口,适配器模式使接口不兼容的那些类能够一块儿工做,其别名为包装器。适配器模式既能够做为类结构型模式,也能够做为对象结构型模式。
  • 适配器模式包含四个角色:目标抽象类定义客户要用的特定领域的接口;适配器类能够调用另外一个接口,做为一个转换器,对适配者和抽象目标类进行适配,它是适配器模式的核心;适配者类是被适配的角色,它定义了一个已经存在的接口,这个接口须要适配;在客户类中针对目标抽象类进行编程,调用在目标抽象类中定义的业务方法。
  • 在类适配器模式中,适配器类实现了目标抽象类接口并继承了适配者类,并在目标抽象类的实现方法中调用所继承的适配者类的方法;在对象适配器模式中,适配器类继承了目标抽象类并定义了一个适配者类的对象实例,在所继承的目标抽象类方法中调用适配者类的相应业务方法。
  • 适配器模式的主要优势是将目标类和适配者类解耦,增长了类的透明性和复用性,同时系统的灵活性和扩展性都很是好,更换适配器或者增长新的适配器都很是方便,符合“开闭原则”;类适配器模式的缺点是适配器类在不少编程语言中不能同时适配多个适配者类,对象适配器模式的缺点是很难置换适配者类的方法。
  • 适配器模式适用状况包括:系统须要使用现有的类,而这些类的接口不符合系统的须要;想要创建一个能够重复使用的类,用于与一些彼此之间没有太大关联的一些类一块儿工做。

 

源代码地址:https://github.com/houzhenhuang/DesignPattern

相关文章
相关标签/搜索