深入解析设计模式中的适配器模式在C++中的运用

2020-01-06 14:48:56于丽

对象适配器的 三相插口和转接头的代码和上面一致。只是整合步骤不一致


class OutletConvertor : public TwoPhaseOutlet 
{ 
public: 
  void doPlugin() 
  { 
    doConvertor(); 
    m_out.doThreePhasePlugin(); 
  } 
  void doConvertor() 
  { 
    cout<<"三相插头转为两厢插头!"<<endl; 
  } 
  ThreePhaseOutlet m_out; 
}; 

对象适配器相比类适配器来说更加灵活,他可以选择性适配自己想适配的对象。例如我们下面把代码改成这样,你也许就会明白为什么我这样说:


class OutletConvertor : public TwoPhaseOutlet 
{ 
public: 
  OutletConvertor(ThreePhaseOutlet out) 
  { 
    m_out = out; 
  } 
  void doPlugin() 
  { 
    doConvertor(); 
    m_out.doThreePhasePlugin(); 
  } 
  void doConvertor() 
  { 
    cout<<"三相插头转为两厢插头!"<<endl; 
  } 
  ThreePhaseOutlet m_out; 
}; 

我们在构造的时候将具体需要适配的适配对象传入,这样便可以根据传入不同的对象,从而对该对象进行适配。而类适配器却无法选择对象,他是对整个类进行适配。也就是把所有的三相插口全部转换为两相的,而不是针对某一个。


在以下各种情况下使用适配器模式:

1、 系统需要使用现有的类,而此类的接口不符合系统的需要。 
2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。 
3、 (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

Adapter模式在实现时有以下这些值得注意的地方:

1、 目标接口可以省略,模式发生退化。但这种做法看似平庸而并不平庸,它可以使Adaptee不必实现不需要的方法(可以参考Default Adapter模式)。其表现形式就是父类实现缺省方法,而子类只需实现自己独特的方法。这有些像模板(Template)模式。 
2、 适配器类可以是抽象类。 
3、 带参数的适配器模式。使用这种办法,适配器类可以根据参数返还一个合适的实例给客户端。



注:相关教程知识阅读请移步到C++教程频道。