樂在其中設計模式(C#) - 橋接模式(Bridge Pattern)
介紹
将抽象部分與它的實作部分分離,使它們都可以獨立地變化。
示例
有一個Message實體類,對它的操作有Insert()和Get()方法,現在使這些操作的抽象部分和實作部分分離。
MessageModel
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Bridge
{
/**//// <summary>
/// Message實體類
/// </summary>
public class MessageModel
/**//// <summary>
/// 構造函數
/// </summary>
/// <param name="msg">Message内容</param>
/// <param name="pt">Message釋出時間</param>
public MessageModel(string msg, DateTime pt)
this._message = msg;
this._publishTime = pt;
}
private string _message;
/// Message内容
public string Message
get
{ return _message; }
set
{ _message = value; }
private DateTime _publishTime;
/// Message釋出時間
public DateTime PublishTime
{ return _publishTime; }
{ _publishTime = value; }
}
}
Message
/// 操作Message(Abstraction)
public class Message
private AbstractMessage _abstractMessage;
/// 操作Message(Implementor)
public AbstractMessage AbstractMessage
{ return _abstractMessage; }
{ _abstractMessage = value; }
/// 擷取Message
/// <returns></returns>
public virtual List<MessageModel> Get()
return _abstractMessage.Get();
/// 插入Message
/// <param name="mm">Message實體對象</param>
public virtual bool Insert(MessageModel mm)
return _abstractMessage.Insert(mm);
MyMessage
/// 操作Message(RefinedAbstraction)
public class MyMessage : Message
public override List<MessageModel> Get()
List<MessageModel> l = base.Get();
foreach (MessageModel mm in l)
mm.Message += "(RefinedAbstraction)";
}
return l;
AbstractMessage
/// 操作Message(Implementor)
public abstract class AbstractMessage
public abstract List<MessageModel> Get();
public abstract bool Insert(MessageModel mm);
SqlMessage
/// Sql方式操作Message(ConcreteImplementor)
public class SqlMessage : AbstractMessage
List<MessageModel> l = new List<MessageModel>();
l.Add(new MessageModel("SQL方式擷取Message", DateTime.Now));
public override bool Insert(MessageModel mm)
// 代碼略
return true;
XmlMessage
/// Xml方式操作Message(ConcreteImplementor)
public class XmlMessage : AbstractMessage
l.Add(new MessageModel("XML方式擷取Message", DateTime.Now));
Test
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();
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());
m.AbstractMessage = new XmlMessage();
運作結果
True
SQL方式擷取Message(RefinedAbstraction) 2007-5-13 19:11:19
XML方式擷取Message(RefinedAbstraction) 2007-5-13 19:11:19
參考
<a href="http://www.dofactory.com/Patterns/PatternBridge.aspx" target="_blank">http://www.dofactory.com/Patterns/PatternBridge.aspx</a>
OK
<a href="http://files.cnblogs.com/webabcd/Pattern.rar">[源碼下載下傳]</a>