设计模式之 - 适配器模式(结构型模式)

  • 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

适配器模式(Adapter Pattern):是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式, 它能使接口不兼容的对象能够相互合作。

什么时候使用适配器模式

在使用一个已经存在的类,但是如果他的接口实现的方法不满足你的要求不同时,就可以使用适配器模式。其实站在软件设计的角度,在开发前期应该考虑好,而不是一开始就使用适配器模式来实现,这样是不合理的。

适配器模式往往存在于软件开发后期两个不兼容接口,并且不易修改,可以使用适配器模式来解决。

业务实例

还记得我们早些时候使用的圆孔耳机(即TSR接口耳机)吗?由于手机迭代更新很快现在很多的手机都使用了Type-C接口,一个孔就解决了耳机、供电接口,那我珍藏的圆孔接口耳机需要如何使用呢?

现在市场上出现了许多的Type-C转,完美的解决了我闲置耳机,在这里的Type-C转在这里扮演的就是适配器的角色!

25775ba8543bd8199594f646892b30b.jpg

适配器模式结构

  • 类适配器

类适配器的实现方式主要是继承,同时继承接口和复用类。

  • 对象适配器

适配器实现了其中一个对象的接口, 并对另一个对象进行封装。

类适配器实现

  • 新增耳机接口实现播放类
public interface IHeadset 
{
    void Play();
}
复制代码
  • 新增 TsrHeadset 类实现Tsr接口播放,该类与耳机接口不兼容
public class TsrHeadset 
{
    public void TsrPlay() 
    {
        Console.WriteLine("使用Tsr接口耳机播放");
    }
}
复制代码
  • 新增兼容类 TypeCAdapter 使其继承IHeadset,TsrHeadset,实现Play方法
public class TypeCAdapter : TsrHeadset, IHeadset
{
    public void Play()
    {
        base.TsrPlay();// 在TypeCAdapter类调用TsrPlay实现接口适配
    }
}
复制代码
  • 执行结果

image.png

如果使用了抽象类,那就意味着多继承,其实在C#、Java等面向对象编程语言,是不支持的,此时我们可以使用对象适配器来实现!

对象适配器实现

在上面代码做了部分优化,实现如下

static void Main(string[] args)
{
    TypeCAdapter adapter = new TypeCAdapter();
    adapter.Play();
    Console.ReadLine();
}

//Tsr耳机类有TsrPlay播放方法
public class TsrHeadset 
{
    public void TsrPlay() 
    {
        Console.WriteLine("使用Tsr接口耳机播放");
    }
}
// 抽象耳机类
public abstract class Headset 
{
    public abstract void Play();
}
//TypeC适配器
public class TypeCAdapter : Headset
{
    private TsrHeadset TsrHeadset = new TsrHeadset();
    public override void Play()
    {
        TsrHeadset.TsrPlay();
    }
}
复制代码

总结

只要客户端代码通过客户端接口与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器,这无疑是适配器模式优点,当然优点还有它可以让任何两个没有关联的类一起运行,提高了类的复用性,但是如果在系统中过多的使用适配器模式,会使系统变得异常复杂,并且不易于把握,如上述在客户端调用的是接口A其实内部调用的是B,会使系统变得很乱,因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

猜你喜欢

转载自juejin.im/post/7132477846399762469