C#设计模式-适配器模式

目录

  • 什么是适配器
  • 在代码中的体现
  • 测试程序:
  • 测试结果:

什么是适配器

简单理解就是接口和接头不匹配,用个转换器来转换一下。现实生活中:
USB转接头:USB接口和其他接口RS232、RJ45等转换。
手机充电头:220V电压转成手机电压。
手机充电线:一根USB线转换成华为,安卓,苹果三个接线头。

在代码中的体现

原本有一个接口,现在又有一个新的类。这个类不能完全实现该接口,在不改变接口和类的情况下,如何对接起来。
代码:
接口:

//有轮子的交通工具
public interface IVehicle
{
     /// 
     /// 跑
     /// 
     void Run();
     /// 
     /// 鸣笛
     /// 
     void Whistle();
 }

其他能实现该接口的类:

//小车
public class Car : IVehicle
{
    public void Run()
    {
        Console.WriteLine("小车跑!");
    }

    public void Whistle()
    {
        Console.WriteLine("小车鸣笛!");
    }
}
//火车
public class Train : IVehicle
{
     public void Run()
     {
         Console.WriteLine("火车跑!");
     }

     public void Whistle()
     {
         Console.WriteLine("火车鸣笛!");
     }
 }

这时,新来了个自行车类:

//自行车
public class Bicycle
{
    /// 
    /// 骑行
    /// 
    public void Cycling()
    {
        Console.WriteLine("自行车骑行!");
    }

    /// 
    /// 按铃
    /// 
    public void RingBell()
    {
        Console.WriteLine("自行车按铃!");
    }
}

该类不完全实现IVehicle接口,也就是接口和类不匹配。这时候需要一个转接器(适配器)类,适配器类的实现方式以下两种:
1.继承:直接继承Bicycle并实现接口

//自行车适配器
public class BicycleInheritAdapter : Bicycle, IVehicle
{
    public void Run()
    {
        Cycling();
    }

    public void Whistle()
    {
        RingBell();
    }
}

2.组合:将Bicycle 类组合在内部,组合的三种方式如下

public class BicycleCombinationAdapter : IVehicle
{
    //1.属性/字段注入:写死的实例,不可为空
    //private Bicycle _bicycle = new Bicycle();

    //2.构造函数注入:可变可传入子类,不可为空,想调用必须传参。
    private Bicycle _bicycle = null;
    public BicycleCombinationAdapter(Bicycle bicycle)
    {
        _bicycle = bicycle;
    }

    //3.方法注入:可变可传入子类,可为空。不传参也可调用。
    //private Bicycle _bicycle = null;
    //public void SetBicycle(Bicycle bicycle)
    //{
    //    _bicycle = bicycle;
    //}

    public void Run()
    {
        _bicycle.Cycling();
    }

    public void Whistle()
    {
        _bicycle.RingBell();
    }
}

测试程序:

internal class Program
{
    static void Main(string[] args)
    {
        IVehicle car = new Car();
        car.Run();
        car.Whistle();
        IVehicle train = new Train();
        train.Run();
        train.Whistle();

        IVehicle bicycleInherit = new BicycleInheritAdapter();
        bicycleInherit.Run();
        bicycleInherit.Whistle();

       //if(bicycleInherit is BicycleInheritAdapter bicycle)
       //{
       //     bicycle.Run();
       //     bicycle.Whistle();
       //     bicycle.Cycling();
       //     bicycle.RingBell();
       //}

        IVehicle bicycleCombination = new BicycleCombinationAdapter(new Bicycle());
        bicycleCombination.Run();
        bicycleCombination.Whistle();
    }
}

其实这两种实现方式个人比较推荐组合的方式,组合比较灵活,继承在if(bicycleInherit is BicycleInheritAdapter bicycle)代码片段中,则将父类所有方法全部继承,且能访问,不管你需不需要,这其实有一定的代码侵入性。

测试结果:

C#设计模式-适配器模式_第1张图片

你可能感兴趣的:(c#,设计模式,适配器模式)