了解适配器模式(C#)

罗伯·麦卡比

我有一个正在编码的场景,我觉得适配器模式很有用。我有一个服务,其中有多个可能的服务提供者,我希望在需要时进行切换,因此只要每个“适配器”遵循相同的规则(接口),底层代码就不会对调用者隐藏。

考虑到这一点,我一直在研究许多示例。此代码段摘自以下堆栈溢出示例

Interface ITarget
{
  public void GetData();
}

//Decision to use MSDAO
class AdaptorMS : ITarget
{
  public void GetData()
  {
    MSDAO objmsdao = new MSDAO();
    objmsdao.GetDataMethod();
  }
}

// calling code
class Client
{
  static void Main(string[] args)
  {
    ITarget objAdaptor = new AdaptorMS();
    object dummyObject = objAdaptor.GetData();
  }
}

然后,我们决定创建一个新的适配器,将其更改为:

//After a month, the decision to use OracaleDAO was taken, so create a new adapter
class AdaptorOracle: ITarget
{
  public void GetData()
  {
    OracleDAO objrracledao = new OracleDAO();
    objoracledao.GetSomeData();
  }
}

// Calling code
class Client
{
  static void Main(string[] args)
  {
    ITarget objAdaptor = new AdaptorOracle();
    object dummyObject = objAdaptor.GetData();
  }
}

我也看过这个例子:

public class AdaptorA : ITarget
{
     private TargetA A { get; set; }

     public AdaptorA( TargetA a )
     {
           this.A = a;
     }

     public void GetData() { 
          return this.A.SomeGetDataCall(); 
     }
}

public class AdaptorB : ITarget
{
     private TargetB B { get; set; }

     public AdaptorB( TargetB a )
     {
           this.B = a;
     }

     public void GetData() { 
          this.B.MakeDataCall(); 
     }
}

我们有两个新的适配器,但是我对上面的示例不了解,事实是Adapter类为将要调用的基础系统采用了一个参数(TargetA或TargetB)。这两个示例有什么区别?我得到第一个示例,将所有实现都隐藏在调用代码中(OracleDAO的实例在适配器内部),但没有第二个示例。有根本的区别还是我误解了这种模式?

在此先感谢您的任何建议!

bcperth

上述两种Adaptor实现之间有一个关键区别。

回顾一下,Adapter只不过是用于提供通用接口的不同类的包装器。可以使用双重继承(类适配器)或通过在适配器内构成和适配对象的实例(对象适配器)来实现它。

上面的示例都是“对象适配器”(按照GoF定义)。

但是,示例2实际上是Strategy和Adaptor的组合,在Adapter类和Adaptee之间提供了额外的去耦层。这更加灵活并且更符合SOLID中的“ D”。

考虑到这一点,现在邀请读者幻想用例,其中每个版本比另一个版本更合适。但是,当如上所述单独呈现时,它们是不同的并且具有不同的用途的事实很容易丢失。

不确定上面的评论是否涵盖了这一点?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章