生活中的设计模式——Adapter

作为编程人员,我们对于设计模式的认知肯定是从软件架构这方面的来,但是其实设计模式这个词的范围远远超过了软件范畴,最初设计模式这个概念是从建筑学来的,并在生活中的很多地方都有它的影子,今天就让我们看一个在生活中经常使用的设计模式。
 
去过马来西亚旅游的同学,应该都知道,马来西亚的充电器插头用的是英标,像这样
在这里插入图片描述
而我们这边的插头用的是国标,像这样
在这里插入图片描述
因为我们在国内使用的都是国标,所以不可避免的我们的手机、电脑充电器插头都只适用于国标插口,那我们要去马来西亚旅游的话,该怎么办呢?

 
在设计模式中,有种模式可以解决这种现有接口与系统需要的规格不匹配的情况。这个模式就是适配器模式,让我们看看UML先:

在这里插入图片描述
可以看到,在这个体系下面,应用场景需要一个新的接口,但是我们现有的系统只实现了另外一个接口。为了正常使用我们的现有系统,需要使用一个适配器来包装一下。具体到上面那个电源插座的标准,是这样的

  • 英标(对应新接口)
   interface IBritishStandard
   {
       void ChargeInBritishStandard();
   }
  • 国标(对应旧接口)
   interface IChineseStandard
   {
       void ChargeInChineseStandard();
   }
  • 游客从国内带过去的充电器,只能支持国标(对应只支持旧接口的系统)
   class ChineseCharger : IChineseStandard
   {
       public void ChargeInChineseStandard()
       {
           Console.WriteLine("Charge in Chinese Standard");
       }
   }
  • 只支持英标的供电设备(对应于只能为新接口提供服务的系统)
    class ElectricPower
    {
        public void Charge(IBritishStandard britishStandard)
        {
            britishStandard.ChargeInBritishStandard();
        }
    }

在这种情况下,如果我们既想给设备充电,又不想重新买一个英标充电器,那么最好的办法就是搞一个适配器,它满足英标接口,但是又能为国标充电。

  • 抽象成代码,我们构建一个Adapter类。
	class ChargerAdapter : IBritishStandard
    {
        IChineseStandard realCharger;
        public ChargerAdapter(IChineseStandard stander)
        {
            this.realCharger = stander;
        }

        public void ChargeInBritishStandard()
        {
            Console.WriteLine("charging through adapter");
            realCharger.ChargeInChineseStandard();
        }
    }

Adapter类实现了英标接口,可以在支持英标接口的供电设备上面使用,同时它在内部调用了国标充电器,实现指令转发。

用代码术语来说,就是转发了调用到老的系统上面,这样真正完成工作的,还是老的系统,通过适配器,新旧系统虽然接口不一,但是还是完成了集成,而且付出的代价微乎其微。

  • 实际运行
	class Program
    {
        static void Main(string[] args)
        {
            ElectricPower electricPower = new ElectricPower();
            ChineseCharger charger = new ChineseCharger();
            ChargerAdapter adapter = new ChargerAdapter(charger);
            electricPower.Charge(adapter);
        }
    }

输出结果:
在这里插入图片描述
证明我们的适配器确实工作了,充电设备通过适配器给国标充电器充上电了。

也许大家会很震惊,那么简单,这就是一个模式?没错,其实设计模式绝非高不可攀,它只是前辈在实践中总结出来的对于某种特定需求的最佳实践而已。适配器模式的使用场景,就是为了解决系统集成但是接口不一致的情况。

同时我们也看出,不一定非要在软件编程实践中学习设计模式,生活中处处有学问,只要用心观察,相信我们在学习任何东西的时候都能更加得心应手,毕竟,大道至简,各行各业的道理应该是相通的。

猜你喜欢

转载自blog.csdn.net/deatharthas/article/details/106844890