设计模式适配器

时间:2014-06-22 23:25:31

标签: c# design-patterns adapter

我学习适配器模式。我有这个代码。它看起来像这种模式? SQLiteConnection,SQLiteCommand,SQLiteDataReader - 它来自其他库

现在,我从数据库中执行任务:连接返回所有用户。我选择了适配器模式:

public class user {
    public string _name { get; set; }
    public string _surname { get; set;}

}

public interface IExercise {
    void connectToDataBase();
    void List<user> returnAllUsers();
}

public Adapter : IExercise {
    SQLiteConnection _conn = null;
    SQLiteCommand _cmd;
    public Adapter(SQLiteConnection conn, SQLiteCommand cmd){
        _conn = conn;
        _cmd = cmd;
    }
    public void connectToDataBase(){
        // not important yet
    }

    public List<user> returnAllUsers(){
        _cmd = _conn.newCommand();
        _cmd.CommandText = "SELECT * FROM users";
        SQLiteDataReader dt = _cmd.ExecuteReader();
        List<user> lu = new List<user>();
        while(dt.Read()){
            lu.Add(new user {
                     _name = dt["name"].ToString(),
                     _surname = dt["surname"].ToString()
                    }
                );
        }
        return lu;
    }
}

我的问题只是:它看起来像适配器模式?

1 个答案:

答案 0 :(得分:3)

我不明白为什么你认为你的代码看起来像一个适配器,你没有不匹配的接口,适配器模式将一个类的接口映射到另一个类,以便它们可以一起工作。这些不兼容的类可能来自不同的库或框架。

enter image description here

工作示例

http://ideone.com/ZZbwAE

<强>定义

  

适配器可帮助两个不兼容的接口协同工作。这是   适配器的真实世界定义。适配器设计模式   当你想要两个不兼容的不同类时使用   接口协同工作。接口可能不兼容,但是   内在功能应该适合需要。适配器模式允许   否则不兼容的类通过转换来协同工作   一个类的接口到客户期望的接口。

来自http://www.dofactory.com/Patterns/PatternAdapter.aspx

的示例
using System;

namespace AdapterPattern
{
  /// <summary>
  /// MainApp startup class for Real-World
  /// Adapter Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      // Non-adapted chemical compound
      Compound unknown = new Compound("Unknown");
      unknown.Display();

      // Adapted chemical compounds
      Compound water = new RichCompound("Water");
      water.Display();

      Compound benzene = new RichCompound("Benzene");
      benzene.Display();

      Compound ethanol = new RichCompound("Ethanol");
      ethanol.Display();

      // Wait for user
      Console.ReadKey();
    }
  }

  /// <summary>
  /// The 'Target' class
  /// </summary>
  class Compound
  {
    protected string _chemical;
    protected float _boilingPoint;
    protected float _meltingPoint;
    protected double _molecularWeight;
    protected string _molecularFormula;

    // Constructor
    public Compound(string chemical)
    {
      this._chemical = chemical;
    }

    public virtual void Display()
    {
      Console.WriteLine("\nCompound: {0} ------ ", _chemical);
    }
  }

  /// <summary>
  /// The 'Adapter' class
  /// </summary>
  class RichCompound : Compound
  {
    private ChemicalDatabank _bank;

    // Constructor
    public RichCompound(string name)
      : base(name)
    {
    }

    public override void Display()
    {
      // The Adaptee
      _bank = new ChemicalDatabank();

      _boilingPoint = _bank.GetCriticalPoint(_chemical, "B");
      _meltingPoint = _bank.GetCriticalPoint(_chemical, "M");
      _molecularWeight = _bank.GetMolecularWeight(_chemical);
      _molecularFormula = _bank.GetMolecularStructure(_chemical);

      base.Display();
      Console.WriteLine(" Formula: {0}", _molecularFormula);
      Console.WriteLine(" Weight : {0}", _molecularWeight);
      Console.WriteLine(" Melting Pt: {0}", _meltingPoint);
      Console.WriteLine(" Boiling Pt: {0}", _boilingPoint);
    }
  }

  /// <summary>
  /// The 'Adaptee' class
  /// </summary>
  class ChemicalDatabank
  {
    // The databank 'legacy API'
    public float GetCriticalPoint(string compound, string point)
    {
      // Melting Point
      if (point == "M")
      {
        switch (compound.ToLower())
        {
          case "water": return 0.0f;
          case "benzene": return 5.5f;
          case "ethanol": return -114.1f;
          default: return 0f;
        }
      }
      // Boiling Point
      else
      {
        switch (compound.ToLower())
        {
          case "water": return 100.0f;
          case "benzene": return 80.1f;
          case "ethanol": return 78.3f;
          default: return 0f;
        }
      }
    }

    public string GetMolecularStructure(string compound)
    {
      switch (compound.ToLower())
      {
        case "water": return "H20";
        case "benzene": return "C6H6";
        case "ethanol": return "C2H5OH";
        default: return "";
      }
    }

    public double GetMolecularWeight(string compound)
    {
      switch (compound.ToLower())
      {
        case "water": return 18.015;
        case "benzene": return 78.1134;
        case "ethanol": return 46.0688;
        default: return 0d;
      }
    }
  }
}