展示如何在運行時動態切換實作部分(SQL/XML),驗證抽象與實作分離的效果:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Pattern.Bridge;
public partial class Bridge : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
MyMessage m = new MyMessage();
// 使用 SQL 實作
m.AbstractMessage = new SqlMessage();
Response.Write(m.Insert(new MessageModel("插入", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString());
Response.Write("<br />");
// 動態切換為 XML 實作
m.AbstractMessage = new XMLMessage();
Response.Write(m.Insert(new MessageModel("插入", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString());
}
}
True
SQL方式獲取Message(RefinedAbstraction) 2007-5-13 19:11:19
True
XML方式獲取Message(RefinedAbstraction) 2007-5-13 19:11:19
MyMessage (RefinedAbstraction) 不變,透過設定 AbstractMessage 屬性切換實作。MyMessage.Get() 在基礎實作結果上附加「(RefinedAbstraction)」,展示抽象層擴展能力。| 優勢 | 說明 |
|---|---|
| 抽象與實作獨立演化 | 新增抽象子類別(如 MyMessage2)不影響實作;新增實作子類別(如 JsonMessage)不影響抽象。 |
| 避免類別爆炸 | 若用繼承,需 SqlMessage、XmlMessage、JsonMessage × 多種抽象變體 = 類別數量乘積。橋接模式將兩維度解耦。 |
| 運行時綁定 | 實作物件可在運行時動態注入,支援插件式架構。 |
| 符合開放封閉原則 | 擴展抽象或實作均無需修改現有代碼。 |