Adapter => 我不會講台語 透過媽媽當翻譯 間接跟阿公溝通
=> 媽媽就是 Adapter = 橋接器
什麼情況下用的到?
前提: 我想用一樣的方式操作所有東西
要解決的問題: 目標不好用、為了降低與目標的藕合、目標還在開發中可能一直變、我得一直配合他改......
這是一個很簡單的Pattern
所以直接看程式碼
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Database msSql = new MsSql();
msSql.GetMember(1);
Database oracleAdpt = new OracleAdapter();
oracleAdpt.GetMember(1); //透過 Adapter 把行為包裝成一樣
Oracle oracle = new Oracle();
oracle.GetMembers("Tom"); //直接叫用 Oracle 會導致行為不一樣
}
}
abstract class Database
{
/// <summary>
/// 本來大家說好 GetMember 都是用 ID 查
/// </summary>
public abstract void GetMember(int id);
}
class MsSql : Database
{
/// <summary>
/// MS-SQL 合法
/// </summary>
public abstract void GetMembers(int id)
{
//開資料庫查
}
}
class Oracle
{
/// <summary>
/// Oracle 亂來,變成用名子查
/// </summary>
public void GetMembers(string name)
{
//開資料庫查
}
}
/// <summary>
/// Oracle 轉接器
/// </summary>
class OracleAdapter : Database
{
//要取代的類別 new 在 Adapter中
private Oracle _Oracle = new Oracle();
/// <summary>
/// 我來讓大家用一樣的方法操作 Oracle
/// </summary>
public override void GetMembers(int id)
{
//假設我先用 id 找出名子
var name = "Tom";
_Oracle.GetMembers(name);
}
}
}
其實這篇的重點是 Adapter 與 Proxy 的差別
Proxy 與 真實物件 之間不改程式碼就可互相取代
Adapter 與 真實物件 之間要改程式碼才可互相取代
複習一下 Proxy (與真實物件繼承同一個父類別)
=> 所以我直接把程式碼裡所有出現 Proxy 的 直接改成 RealClass 編譯會過
class RealClass : BaseClass
class Proxy : BaseClass
再看一下 Adapter (真實物件沒繼承同一個父類別)
=> 所以我直接把程式碼裡所有出現 Adapter 的 直接改成 RealClass 編譯不會過
abstract class Database
class MsSql : Database
class Oracle
class OracleAdapter : Database