/* Notes:
 * Adapters are often used when client code is written to expect classes
 * from one framework, and it meant to work with classes from a totally
 * different framework. Assume you cannot change the code of either framework.
 * the solution is for you to write an adapter, which appears like a
 * native class to each framework. 
 *
 * There are two different types of adapters - class adapter and object
 * adapter. Class adapters are based on multiple inheritance - specifically
 * the interface of the target class and the implementation of the adaptee.
 * Unfortunately C# supports multiple inheritance for interfaces but not
 * for classes. Object adapters derive from the target (single inheritance)
 * and maintain a private instance of the adoptee.
 *
 * The sample code here shows an object adapter. We have a class called
 * FrameworkYAdaptee which we wish to use, yet the (bulk of) the client code
 * (in GenericClientCode) is written to expect a class called FrameworkXTarget.
 * To solve the probelm we create an Adapter class, which it a FrameworkXTarget
 * to the client, and calls FrameworkYAdaptee.
 *
 */
 
namespace Adapter_DesignPattern
{
    using System;

 class FrameworkXTarget
 {
  virtual public void SomeRequest(int x)
  {
   // normal implementation of SomeRequest goes here     
  }
 }

 class FrameworkYAdaptee
 {
  public void QuiteADifferentRequest(string str)
  {
   Console.WriteLine("QuiteADifferentRequest = {0}", str);
  }  
 }

 class OurAdapter : FrameworkXTarget
 {
  private FrameworkYAdaptee adaptee = new FrameworkYAdaptee();
  override public void SomeRequest(int a)
  {
   string b;
   b = a.ToString();
   adaptee.QuiteADifferentRequest(b);
  }  
 }

    /// <summary>
    ///    Summary description for Client.
    /// </summary>
    public class Client
    {
        void GenericClientCode(FrameworkXTarget x)
  {
   // We assume this function contains client-side code that only
   // knows about FrameworkXTarget.
   x.SomeRequest(4);
   // other calls to FrameworkX go here
   // ...
  }
  
  public static int Main(string[] args)
        {
   Client c = new Client();
            FrameworkXTarget x = new OurAdapter();
   c.GenericClientCode(x); 
            return 0;
        }
    }
}

posted on 2004-06-03 14:51  hi-justin  阅读(445)  评论(0编辑  收藏  举报