返回“設計模式(C#)系列文章索引”
介紹
將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
示例
有一個Message實體類,某個類對它的操作有Insert()和Get()方法。現在需要把這個類轉到另一個接口,分別對應Add()和Select()方法。
MessageModel
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Adapter
{
/**//// <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;
/**//// <summary>
/// Message內容
/// </summary>
public string Message
{
get { return _message; }
set { _message = value; }
}
private DateTime _publishTime;
/**//// <summary>
/// Message發布時間
/// </summary>
public DateTime PublishTime
{
get { return _publishTime; }
set { _publishTime = value; }
}
}
}
SqlMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Adapter
{
/**//// <summary>
/// 源(Adaptee)角色
/// Sql方式操作Message
/// </summary>
public class SqlMessage
{
/**//// <summary>
/// 獲取Message
/// </summary>
/// <returns></returns>
public List<MessageModel> Get()
{
List<MessageModel> l = new List<MessageModel>();
l.Add(new MessageModel("SQL方式獲取Message", DateTime.Now));
return l;
}
/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="mm">Message實體對象</param>
/// <returns></returns>
public bool Insert(MessageModel mm)
{
// 代碼略
return true;
}
}
}
IMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Adapter
{
/**//// <summary>
/// 目標(Target)角色
/// 操作Message的接口
/// </summary>
public interface IMessage
{
/**//// <summary>
/// 獲取Message
/// </summary>
/// <returns></returns>
List<MessageModel> Select();
/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="mm">Message實體對象</param>
/// <returns></returns>
bool Add(MessageModel mm);
}
}
Message
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Adapter
{
/**//// <summary>
/// 適配器(Adapter)角色
/// 類適配器
/// 把源適配到這個類
/// </summary>
public class Message : SqlMessage, IMessage
{
/**//// <summary>
/// 獲取Message
/// </summary>
/// <returns></returns>
public List<MessageModel> Select()
{
return base.Get();
}
/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="mm">Message實體對象</param>
/// <returns></returns>
public bool Add(MessageModel mm)
{
return base.Insert(mm);
}
}
}
Message2
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Adapter
{
/**//// <summary>
/// 適配器(Adapter)角色
/// 對象適配器
/// 把源適配到這個類
/// </summary>
public class Message2 : IMessage
{
private SqlMessage _sqlMessage;
/**//// <summary>
/// 構造函數
/// </summary>
public Message2()
{
_sqlMessage = new SqlMessage();
}
/**//// <summary>
/// 獲取Message
/// </summary>
/// <returns></returns>
public List<MessageModel> Select()
{
return _sqlMessage.Get();
}
/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="mm">Message實體對象</param>
/// <returns></returns>
public bool Add(MessageModel mm)
{
return _sqlMessage.Insert(mm);
}
}
}
client
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.Adapter;
public partial class Adapter : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
IMessage m;
m = new Message();
Response.Write("類適配器方式<br />");
Response.Write(m.Add(new MessageModel("插入", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Select()[0].Message + " " + m.Select()[0].PublishTime.ToString());
Response.Write("<br /><br />");
m = new Message2();
Response.Write("對象適配器方式<br />");
Response.Write(m.Add(new MessageModel("插入", DateTime.Now)));
Response.Write("<br />");
Response.Write(m.Select()[0].Message + " " + m.Select()[0].PublishTime.ToString());
Response.Write("<br />");
}
}
運行結果
類適配器方式
True
SQL方式獲取Message 2007-4-8 20:59:29
對象適配器方式
True
SQL方式獲取Message 2007-4-8 20:59:29
參考
http://www.dofactory.com/Patterns/PatternAdapter.aspx
OK