2013年10月11日 星期五

Design Patterm : Adapter

Design Patterm : 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


Adapter類似套件, 可以改變既有物件的實際行為,但是使用者並不會發覺。
例如底下的例子,一台車 (ICar) 行進中(Drive()), 我們可以從手動駕駛調整為自動駕駛,對於車子來說,它仍是做駕駛” ( Call Drive() )這件事情, 但是底層已經悄悄的利用Adapter改為自動駕駛的方法了。




1.  既有的InterfaceClass

public interface ICar
{
  DPLib.Color Color { get; set; }
  String Name { get; set; }
 
void Drive();
}


public class Civic : ICar
{
  
private DPLib.Color color;
  
private String name;// = typeof(Civic).Name;
  
private const String BRAND = "HONDA";
  
public Civic()
   {
     
//
取得當前類別名稱
     
name = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;
   }
  
public DPLib.Color Color
   {
    
get { return color; }
    
set { color = value; }
   }
  
public String Name
   {
    
get { return name; }
    
set { name = value; }
   }
  
public void Drive()
   {
     
Console.WriteLine("I am driving {0} {1} ({2})", color.ToString(), name, BRAND);
   }
}

2.  Adaptee提供Adpter轉換後的方法

/// <summary>
///
Adptee:
提供Adpter轉換後的方法
/// </summary>
public class AdapteeCar
{
  public void AutoDrive(String _name, DPLib.Color _color)
  {
    
Console.WriteLine( String.Format("{0} {1}
自動駕駛中",
            _color.ToString(), _name));
  }
}

3.  Adapter :  有繼承和組合兩種方式:

繼承方法 (Class way)
public class AdapterCar:AdapteeCar, DPLib.ICar
{
   ///
省略一些實作ICar的屬性程式碼
  
  
void DPLib.ICar.Drive()
  
{
     
//使用AdpteeAutoDrive方法
     
base.AutoDrive(this.name, this.color);
  
}
}

u  Adapter實做了ICar 因為它需要adapt Drive() 這個方法。
u  Adapter繼承了AdapteeCar,因為在Drive() 裡面要改用AdapteeCarAutoDrive()方法。



組合方法 (Object way) : 只列出不同的地方
public class AdapterCar_Obj:DPLib.ICar
{
  
private AdapteeCar adapteeCar = new AdapteeCar();
  
//… 省略
  
void DPLib.ICar.Drive()
   {
    
//使用AdpteeAutoDrive方法
    
this.adapteeCar.AutoDrive(this.name, this.color);
   }
}

4.  主程式:
PS.
即使調用Adapter 車子仍是呼叫Drive()這個行為。

///
手動駕駛
DPLib.ICar car = new DPLib.Civic();
car.Color = DPLib.
Color.Silver;
car.Drive();

///調用Adapter (Class方式 ie.繼承)
DPLib.ICar carAdp = new AdapterCar();
carAdp.Name =
"喜美";
carAdp.Color = DPLib.
Color.Silver;
carAdp.Drive();


///
調用Adapter (Object方式 ie.組合)
DPLib.ICar carAdp2 = new AdapterCar_Obj();
carAdp2.Name =
"喜美2";
carAdp2.Color = DPLib.
Color.Yellow;
carAdp2.Drive();


結果
I am driving Silver Civic (HONDA)
Silver
喜美 自動駕駛中
Yellow
喜美2 自動駕駛中

5.  延伸閱讀:
Design Pattern : Bridge



沒有留言:

張貼留言