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.
既有的Interface和Class
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);
}
}
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));
}
}
/// <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()
{
//使用Adptee的AutoDrive方法
base.AutoDrive(this.name, this.color);
}
}
※ 繼承方法 (Class way)
public class AdapterCar:AdapteeCar, DPLib.ICar
{
///省略一些實作ICar的屬性程式碼 …
void DPLib.ICar.Drive()
{
//使用Adptee的AutoDrive方法
base.AutoDrive(this.name, this.color);
}
}
u Adapter實做了ICar , 因為它需要adapt Drive() 這個方法。
u Adapter繼承了AdapteeCar,因為在Drive() 裡面要改用AdapteeCar的AutoDrive()方法。
※ 組合方法 (Object way) : 只列出不同的地方
public class AdapterCar_Obj:DPLib.ICar
{
private AdapteeCar adapteeCar = new AdapteeCar();
//… 省略
void DPLib.ICar.Drive()
{
//使用Adptee的AutoDrive方法
this.adapteeCar.AutoDrive(this.name, this.color);
}
}
public class AdapterCar_Obj:DPLib.ICar
{
private AdapteeCar adapteeCar = new AdapteeCar();
//… 省略
void DPLib.ICar.Drive()
{
//使用Adptee的AutoDrive方法
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 自動駕駛中
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 自動駕駛中
6.
Reference
Adapter, Proxy, Decrator, and AOP
How do the Proxy, Decorator, Adapter, and Bridge Patterns differ?
Adapter, Proxy, Decrator, and AOP
How do the Proxy, Decorator, Adapter, and Bridge Patterns differ?
沒有留言:
張貼留言