asp.net

asp.net,c#
结构型模式 适配器模式
Adapter
Definition


Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.

UML class diagram
适配器模式

 

Participants

   The classes and/or objects participating in the Adapter pattern are:

  • Target   (ChemicalCompound)
    • defines the domain-specific interface that Client uses.
  • Adapter   (Compound)
    • adapts the interface Adaptee to the Target interface.
  • Adaptee   (ChemicalDatabank)
    • defines an existing interface that needs adapting.
  • Client   (AdapterApp)
    • collaborates with objects conforming to the Target interface.

This structural code demonstrates the Adapter pattern which maps the interface of one class onto another so that they can work together. These incompatible classes may come from different libraries or frameworks.



using System;

// "Target"


class
Target

{
  // Methods
  virtual public void Request()
  {
    // Normal implementation goes here
  }
}

// "Adapter"


class
Adapter : Target

{
  // Fields
  private Adaptee adaptee = new Adaptee();

 
// Methods
  override public void Request()
  {
    // Possibly do some data manipulation
    // and then call SpecificRequest
    adaptee.SpecificRequest();
  }
}

// "Adaptee"


class
Adaptee

{
  // Methods
  public void SpecificRequest()
  {
    Console.WriteLine("Called SpecificRequest()" );
  }
}

///
<summary>

/// Client test
/// </summary>
public class Client
{
  public static void Main(string[] args)
  {
    // Create adapter and place a request
    Target t = new Adapter();
    t.Request();

  }
}


This real-world code demonstrates the use of a legacy chemical databank. Chemical compound objects access the databank through an Adapter interface.


using System;

// "Target"

class ChemicalCompound
{
  // Fields
  protected string name;
  protected float boilingPoint;
  protected float meltingPoint;
  protected double molecularWeight;
  protected string molecularFormula;

 
// Constructors
  public ChemicalCompound( string name )
  {
    this.name = name;
  }

 
// Properties
  public float BoilingPoint
  {
    get{ return boilingPoint; }
  }

  public
float MeltingPoint

  {
    get{ return meltingPoint; }
  }

  public
double MolecularWeight

  {
    get{ return molecularWeight; }
  }

  public
string MolecularFormula

  {
    get{ return molecularFormula; }
  }
}

// "Adapter"


class
Compound : ChemicalCompound

{
  // Fields
  private ChemicalDatabank bank;

 
// Constructors
  public Compound( string name ) : base( name )
  {
    // Adaptee
    bank = new ChemicalDatabank();
    // Adaptee request methods
    boilingPoint = bank.GetCriticalPoint( name, "B" );
    meltingPoint = bank.GetCriticalPoint( name, "M" );
    molecularWeight = bank.GetMolecularWeight( name );
    molecularFormula = bank.GetMolecularStructure( name );
  }

 
// Methods
  public void Display()
  {
    Console.WriteLine("\nCompound: {0} ------ ",name );
    Console.WriteLine(" Formula: {0}",MolecularFormula);
    Console.WriteLine(" Weight : {0}",MolecularWeight );
    Console.WriteLine(" Melting Pt: {0}",MeltingPoint );
    Console.WriteLine(" Boiling Pt: {0}",BoilingPoint );
  }
}

// "Adaptee"


class
ChemicalDatabank

{
  // Methods -- the Databank 'legacy API'
  public float GetCriticalPoint( string compound, string point )
  {
    float temperature = 0.0F;
    // Melting Point
    if( point == "M" )
    {
      switch( compound.ToLower() )
      {
        case "water": temperature = 0.0F; break;
        case "benzene" : temperature = 5.5F; break;
        case "alcohol": temperature = -114.1F; break;
      }
    }
    // Boiling Point
    else
    {
      switch( compound.ToLower() )
      {
        case "water": temperature = 100.0F;break;
        case "benzene" : temperature = 80.1F; break;
        case "alcohol": temperature = 78.3F; break;
      }
    }
    return temperature;
  }

  public
string GetMolecularStructure( string compound )

  {
    string structure = "";
    switch( compound.ToLower() )
    {
      case "water": structure = "H20"; break;
      case "benzene" : structure = "C6H6"; break;
      case "alcohol": structure = "C2H6O2"; break;
    }
    return structure;
  }

  public
double GetMolecularWeight( string compound )

  {
    double weight = 0.0;
    switch( compound.ToLower() )
    {
      case "water": weight = 18.015; break;
      case "benzene" : weight = 78.1134; break;
      case "alcohol": weight = 46.0688; break;
    }
    return weight;
  }
}

///
<summary>

/// AdapterApp test application
/// </summary>
public class AdapterApp
{
  public static void Main(string[] args)
  {
    // Retrieve and display water characteristics
    Compound water = new Compound( "Water" );
    water.Display();

   
// Retrieve and display benzene characteristics
    Compound benzene = new Compound( "Benzene" );
    benzene.Display();

   
// Retrieve and display alcohol characteristics
    Compound alcohol = new Compound( "Alcohol" );
    alcohol.Display();

  }
}

posted on 2007-03-08 20:39  灵魂边缘  阅读(230)  评论(0编辑  收藏  举报