新聞中心
策略模式在我們?nèi)粘i_發(fā)中經(jīng)常被用到,這篇文章不是策略模式的深入討論和學(xué)術(shù)研究,只是讓初學(xué)者能有個基本的了解。

什么叫策略:1. 可以實(shí)現(xiàn)目標(biāo)的方案集合;2. 根據(jù)形勢發(fā)展而制定的行動方針和斗爭方法;3. 有斗爭藝術(shù),能注意方式方法。
什么叫模式:模式(Pattern)其實(shí)就是解決某一類問題的方法論。把解決某類問題的方法總結(jié)歸納到理論高度,那就是模式。模式是一種指導(dǎo),在一個良好的指導(dǎo)下,有助于你完成任務(wù),有助于你作出一個優(yōu)良的設(shè)計(jì)方案,達(dá)到事半功倍的效果。而且會得到解決問題的***辦法。
什么叫策略模式:策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
從上面的官方解釋來看,我們已經(jīng)有了一個基本的雛形。其實(shí)設(shè)計(jì)模式就是前輩們所總結(jié)出來的,用來解決某類問題的方法論;這些方法論是經(jīng)過身經(jīng)百戰(zhàn)的專家們提煉出來的,比較規(guī)范的、比較科學(xué)的模型。
其實(shí)設(shè)計(jì)模式對初學(xué)者來說可能有點(diǎn)頭疼,比較抽象。大概就是因?yàn)槌鯇W(xué)者對一些概念不能深度的理解,一些理論知識還沒能夠融會貫通,不過不要緊經(jīng)過一段時間的實(shí)踐鍛煉就能理解了;下面我們循環(huán)漸進(jìn)的來講解什么叫策略模式。我們拿真實(shí)項(xiàng)目中遇到的問題來講解吧,這樣能更好的吸引注意力。
情景引入:
您是否遇到過這樣一個頭疼的問題,在我們開發(fā)信息系統(tǒng)的時候,經(jīng)常需要切換不同的數(shù)據(jù)庫。但是由于我們前期開發(fā)項(xiàng)目的時候沒有考慮到后期的變更,所以這個時候問題就來了。如果需要更換數(shù)據(jù)庫,將大動干戈把代碼翻個底朝天。將諸如一些Sql、Oledb、Oracle之類的對象進(jìn)行全局替換。這樣的設(shè)計(jì)永遠(yuǎn)都無法滿足日后的數(shù)據(jù)庫變更需求。所以在前期設(shè)計(jì)的時候,我們就需要考慮到系統(tǒng)后期可能存在哪些可能變化的地方,在系統(tǒng)的架構(gòu)上就需要變通設(shè)計(jì)(比如:依賴接口而不是具體的對象,通過依賴注入等方式進(jìn)行策略的變更;)。其實(shí)這個時候我們很需要一種模式能解決此類問題,恰好前輩們?yōu)槲覀儨?zhǔn)備好了(策略模式)。[設(shè)計(jì)模式的設(shè)計(jì)原則:盡可能的考慮系統(tǒng)后期的變化;]
1.沒有分析之前的系統(tǒng)結(jié)構(gòu):
情景分析:
我們暫且不談設(shè)計(jì)模式,我們試著自己分析一下問題。我們需要一種機(jī)制,能在需要的時候自動變更后臺數(shù)據(jù)源的連接對象;我們來收集問題,既然要自動變更后臺數(shù)據(jù)源連接對象,那么我們在編碼的過程中就不能直接使用一些諸如SqlConnection、SqlCommand等對象,必須進(jìn)行提取形成接口,消除類之間的強(qiáng)耦合。[面向?qū)ο缶幊淘瓌t:面向接口編程,而不是面向?qū)崿F(xiàn)編程;]
2.分析之后的系統(tǒng)結(jié)構(gòu)圖:
情景分析->接口提取:
- /*----------------------------------------------------------------
- * 作者:王清培
- * 時間:2010-10-29
- * ----------------------------------------------------------------*/
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Data;
- using System.Data.SqlClient;
- namespace W.Data
- {
- ///
- /// 通用數(shù)據(jù)源類型接口,
- /// 確定每種數(shù)據(jù)源必須實(shí)現(xiàn)基本的對IDbConnection,IDbCommand,IDbTransaction 三者的包裝;
- ///
- public interface IDataSourceType
- {
- #region 屬性
- ///
- /// 獲取或設(shè)置數(shù)據(jù)源連接字符串。
- ///
- string ConnectionString { get; set; }
- #endregion
- ///
- /// 開始數(shù)據(jù)庫事務(wù)。
- ///
- void BeginTransaction();
- ///
- /// 提交事務(wù)處理。
- ///
- void Commit();
- ///
- /// 從掛起狀態(tài)回滾事務(wù)。
- ///
- void Rollback();
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。
- ///
- /// 要執(zhí)行的命令文本
- ///
DataSet - DataSet ExecuteDataSet(string commandtext);
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。
- ///
- /// 指定如何解釋命令字符串。
- /// 命令文本
- /// IDbDataParameter參數(shù)列表
- ///
DataSet - DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
- ///
- /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
- ///
- /// 命令文本
- ///
受影響的行數(shù) - int ExecuteNonQuery(string cmdText);
- ///
- /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDbDataParameter參數(shù)列表
- ///
受影響的行數(shù) - int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
- ///
- /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
- ///
- /// IDbConnection對象
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDbDataParameter參數(shù)列表
- ///
受影響的行數(shù) - int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- ///對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。已事務(wù)的方式執(zhí)行
- ///
- /// IDbTransaction對象。
- /// 指定如何解析命令字符串。
- /// 命令文本。
- /// IDbDataParameter參數(shù)列表。
- ///
受影響的行數(shù)。 - int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。
- ///
- /// 執(zhí)行的命令文本
- ///
IDataReader對象 - IDataReader ExecuteReader(string cmdText);
- ///
- /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter參數(shù)列表
- ///
IDataReader對象 - IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。
- ///
- /// 命令文本
- ///
結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing) - object ExecuteScalar(string cmdText);
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter參數(shù)列表
- ///
結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing)。 - object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。
- ///
- /// 命令文本
- ///
DataTable - DataTable ExecuteTable(string cmdText);
- ///
- ///執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter參數(shù)列表
- ///
DataTable - DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 關(guān)閉數(shù)據(jù)庫連接。
- ///
- void Close();
- ///
- /// 執(zhí)行與釋放或重置非托管資源相關(guān)的應(yīng)用程序定義的任務(wù)。
- ///
- void Dispose();
- }
- }
情景分析->OLEDB數(shù)據(jù)源實(shí)現(xiàn):
- /*----------------------------------------------------------------
- * 作者:王清培
- * 時間:2010-10-29
- * ----------------------------------------------------------------*/
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Configuration;
- using System.Data.OleDb;
- using System.Data;
- namespace W.Data
- {
- ///
- /// OLEDB數(shù)據(jù)源
- ///
- public sealed class OledbSource : IDataSourceType, IDisposable
- {
- #region 字段
- ///
- /// 是否已開始數(shù)據(jù)庫事務(wù)處理
- ///
- private bool _begin = false;
- ///
- /// IDbConnection對象(包裝的SqlConnection對象)
- ///
- private OleDbConnection _connection;
- ///
- /// IDbTransaction對象(包裝的SqlTransaction對象)
- ///
- private OleDbTransaction _transaction;
- ///
- /// 靜態(tài)全局(SQLServerSource數(shù)據(jù)源)實(shí)例連接字符串對象;
- ///
- private static string _globalconnectionstring = string.Empty;
- #endregion
- #region 屬性
- ///
- /// 獲取,靜態(tài)全局SQLServerSource數(shù)據(jù)源實(shí)例連接字符串對象;
- ///
- public static string GlobalConnectionString
- {
- get { return _globalconnectionstring; }
- }
- ///
- /// 獲取或設(shè)置本次執(zhí)行的數(shù)據(jù)源的連接字符串
- ///
- public string ConnectionString
- {
- get { return _connection.ConnectionString; }
- set { _connection.ConnectionString = value; }
- }
- ///
- /// 獲取包裝的SqlTransaction對象
- ///
- public OleDbTransaction SqlTransaction
- {
- get { return _transaction; }
- }
- #endregion
- #region 構(gòu)造函數(shù)
- ///
- /// 靜態(tài)構(gòu)造函數(shù)。
- ///
- static OledbSource()
- {
- //設(shè)置全局(SQLServerSource實(shí)例)對象的默認(rèn)連接字符串
- _globalconnectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
- }
- ///
- ///默認(rèn)實(shí)例構(gòu)造函數(shù)
- ///
- public OledbSource()
- {
- _connection = new OleDbConnection(_globalconnectionstring);
- }
- ///
- /// 重載構(gòu)造函數(shù),使用指定連接字符串來初始化 CommandLib.Data.SQLServerSource 類的新實(shí)例。默認(rèn)所有的SQLServerSource實(shí)例均使用
- /// 配置文件中的SQLServerConnectionString類型的連接字符串。
- ///
- /// 連接字符串
- public OledbSource(string connectionstring)
- {
- _connection = new OleDbConnection(connectionstring);
- }
- #endregion
- #region 實(shí)例方法
- ///
- /// 開始數(shù)據(jù)庫事務(wù)。
- ///
- public void BeginTransaction()
- {
- _begin = true;
- _connection.Open();
- _transaction = _connection.BeginTransaction();//新建數(shù)據(jù)源的事務(wù)對象
- }
- ///
- /// 提交事務(wù)處理。
- ///
- public void Commit()
- {
- _begin = false;
- _transaction.Commit();
- _transaction = null;//事務(wù)執(zhí)行完畢全部清除(事務(wù)不是很常用不需要一直保留)
- _connection.Close();
- }
- ///
- /// 從掛起狀態(tài)回滾事務(wù)。
- ///
- public void Rollback()
- {
- _begin = false;
- _transaction.Rollback();
- _transaction = null;//事務(wù)執(zhí)行完畢全部清除(事務(wù)不是很常用不需要一直保留)
- _connection.Close();
- }
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。
- ///
- /// 命令文本
- ///
DataSet - public DataSet ExecuteDataSet(string commandtext)
- {
- return ExecuteDataSet(CommandType.Text, commandtext, null);
- }
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。
- ///
- /// 指定如何解釋命令字符串
- /// 命令文本
- /// IDbDataParameter參數(shù)列表
- ///
DataSet - public DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter)
- {
- if (_connection.State == ConnectionState.Closed)
- _connection.Open();
- OleDbCommand commmand = InitSqlCommand(commandtype, commandtext, parameter);
- OleDbDataAdapter adapter = new OleDbDataAdapter(commmand);
- DataSet ds = new DataSet();
- adapter.Fill(ds);
- return ds;
- }
- ///
- /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
- ///
- /// 命令文本
- ///
受影響的行數(shù) - public int ExecuteNonQuery(string cmdText)
- {
- return ExecuteNonQuery(CommandType.Text, cmdText, null);
- }
- ///
- /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
- ///
- /// IDbConnection對象
- /// 指定如何解析命令字符串
- /// 命令文本
- ///
受影響的行數(shù) - public int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter)
- {
- if (_connection.State == ConnectionState.Closed)
- _connection.Open();
- OleDbCommand command = InitSqlCommand(commandtype, commandtext, parameter);
- return command.ExecuteNonQuery();
- }
- ///
- /// 重載ExecuteNonQuery方法。
- ///
- /// IDbConnection對象
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDbDataParameter參數(shù)列表
- ///
受影響的行數(shù) - public int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- command.Connection = (conn as OleDbConnection);
- return command.ExecuteNonQuery();
- }
- ///
- /// 重載ExecuteNonQuery方法。以事務(wù)的方式執(zhí)行
- ///
- /// IDbTransaction對象。
- /// 指定如何解析命令字符串。
- /// 命令文本。
- /// IDbDataParameter參數(shù)列表。
- ///
受影響的行數(shù)。 - public int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- command.Transaction = (trans as OleDbTransaction);
- return command.ExecuteNonQuery();
- }
- ///
- /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。
- ///
- /// 執(zhí)行的命令文本
- ///
IDataReader對象 - public IDataReader ExecuteReader(string cmdText)
- {
- return ExecuteReader(CommandType.Text, cmdText, null);
- }
- ///
- /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter參數(shù)列表
- ///
IDataReader對象 - public IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- return command.ExecuteReader();
- }
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。
- ///
- /// 命令文本
- ///
結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing) - public object ExecuteScalar(string cmdText)
- {
- return ExecuteScalar(CommandType.Text, cmdText, null);
- }
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter參數(shù)列表
- ///
結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing)。 - public object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- return command.ExecuteScalar();
- }
- ///
- /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。
- ///
- /// 命令文本
- ///
DataTable - public DataTable ExecuteTable(string cmdText)
- {
- return ExecuteTable(CommandType.Text, cmdText, null);
- }
- ///
- ///執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter參數(shù)列表
- ///
DataTable - public DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- DataTable resulttb = new DataTable();
名稱欄目:淺談.NET策略模式
標(biāo)題路徑:http://www.dlmjj.cn/article/djsgsdh.html


咨詢
建站咨詢
