透過繼承 SqlMessage 並實作 IMessage 介面,將源介面適配為目標介面:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Adapter
{
///
/// 適配器(Adapter)角色 - 類別適配器
/// 把源適配到這個類別
///
public class Message : SqlMessage, IMessage
{
///
/// 獲取 Message
///
/// MessageModel 清單
public List<MessageModel> Select()
{
return base.Get();
}
///
/// 插入 Message
///
/// Message 實體物件
/// 是否成功
public bool Add(MessageModel mm)
{
return base.Insert(mm);
}
}
}
透過組合 SqlMessage 實例並實作 IMessage 介面,委派呼叫給內部物件:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Adapter
{
///
/// 適配器(Adapter)角色 - 物件適配器
/// 把源適配到這個類別
///
public class Message2 : IMessage
{
private SqlMessage _sqlMessage;
///
/// 建構函式
///
public Message2()
{
_sqlMessage = new SqlMessage();
}
///
/// 獲取 Message
///
/// MessageModel 清單
public List<MessageModel> Select()
{
return _sqlMessage.Get();
}
///
/// 插入 Message
///
/// Message 實體物件
/// 是否成功
public bool Add(MessageModel mm)
{
return _sqlMessage.Insert(mm);
}
}
}
| 維度 | 類別適配器 (繼承) | 物件適配器 (組合) |
|---|---|---|
| 實現方式 | 繼承源類別 + 實作目標介面 | 持有源類別實例 + 實作目標介面 |
| 耦合度 | 較高(繼承關係) | 較低(委派關係) |
| 覆寫源行為 | 容易(可 override) | 較難(需重新委派) |
| 適用多個源 | 單一繼承限制,難以適配多個源 | 可組合多個源物件 |
| 符合原則 | 違反「組合優於繼承」 | 符合「組合優於繼承」 |
本例中兩種適配器都將 SqlMessage 的 Get()/Insert() 適配為 IMessage 的 Select()/Add(),展示適配器模式「介面轉換」的核心價值。