作为编程人员,我们对于设计模式的认知肯定是从软件架构这方面的来,但是其实设计模式这个词的范围远远超过了软件范畴,最初设计模式这个概念是从建筑学来的,并在生活中的很多地方都有它的影子,今天就让我们看一个在生活中经常使用的设计模式。
去过马来西亚旅游的同学,应该都知道,马来西亚的充电器插头用的是英标,像这样
而我们这边的插头用的是国标,像这样
因为我们在国内使用的都是国标,所以不可避免的我们的手机、电脑充电器插头都只适用于国标插口,那我们要去马来西亚旅游的话,该怎么办呢?
在设计模式中,有种模式可以解决这种现有接口与系统需要的规格不匹配的情况。这个模式就是适配器模式,让我们看看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);
}
}
输出结果:
证明我们的适配器确实工作了,充电设备通过适配器给国标充电器充上电了。
也许大家会很震惊,那么简单,这就是一个模式?没错,其实设计模式绝非高不可攀,它只是前辈在实践中总结出来的对于某种特定需求的最佳实践而已。适配器模式的使用场景,就是为了解决系统集成但是接口不一致的情况。
同时我们也看出,不一定非要在软件编程实践中学习设计模式,生活中处处有学问,只要用心观察,相信我们在学习任何东西的时候都能更加得心应手,毕竟,大道至简,各行各业的道理应该是相通的。