日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺談.NET策略模式

策略模式在我們?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)圖:

情景分析->接口提取:

 
 
 
 
  1. /*----------------------------------------------------------------
  2.   * 作者:王清培
  3.   * 時間:2010-10-29
  4.   * ----------------------------------------------------------------*/
  5.   using System;
  6.   using System.Collections.Generic;
  7.   using System.Text;
  8.   using System.Data;
  9.   using System.Data.SqlClient;
  10.   namespace W.Data
  11.   {
  12.   /// 
  13.   /// 通用數(shù)據(jù)源類型接口,
  14.   /// 確定每種數(shù)據(jù)源必須實(shí)現(xiàn)基本的對IDbConnection,IDbCommand,IDbTransaction 三者的包裝;
  15.   /// 
  16.   public interface IDataSourceType
  17.   {
  18.   #region 屬性
  19.   /// 
  20.   /// 獲取或設(shè)置數(shù)據(jù)源連接字符串。
  21.   /// 
  22.   string ConnectionString { get; set; }
  23.   #endregion
  24.   /// 
  25.   /// 開始數(shù)據(jù)庫事務(wù)。
  26.   /// 
  27.   void BeginTransaction();
  28.   /// 
  29.   /// 提交事務(wù)處理。
  30.   /// 
  31.   void Commit();
  32.   /// 
  33.   /// 從掛起狀態(tài)回滾事務(wù)。
  34.   /// 
  35.   void Rollback();
  36.   /// 
  37.   /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。
  38.   /// 
  39.   /// 要執(zhí)行的命令文本
  40.   /// DataSet
  41.   DataSet ExecuteDataSet(string commandtext);
  42.   /// 
  43.   /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。
  44.   /// 
  45.   ///  指定如何解釋命令字符串。
  46.   /// 命令文本
  47.   /// IDbDataParameter參數(shù)列表
  48.   /// DataSet
  49.   DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
  50.   /// 
  51.   /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
  52.   /// 
  53.   /// 命令文本
  54.   /// 受影響的行數(shù)
  55.   int ExecuteNonQuery(string cmdText);
  56.   /// 
  57.   /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
  58.   /// 
  59.   /// 指定如何解析命令字符串
  60.   /// 命令文本
  61.   /// IDbDataParameter參數(shù)列表
  62.   /// 受影響的行數(shù)
  63.   int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
  64.   /// 
  65.   /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
  66.   /// 
  67.  /// IDbConnection對象
  68.  /// 指定如何解析命令字符串
  69.   /// 命令文本
  70.   /// IDbDataParameter參數(shù)列表
  71.  /// 受影響的行數(shù)
  72.   int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  73.   /// 
  74.   ///對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。已事務(wù)的方式執(zhí)行
  75.   /// 
  76.   /// IDbTransaction對象。
  77.   /// 指定如何解析命令字符串。
  78.   /// 命令文本。
  79.   /// IDbDataParameter參數(shù)列表。
  80.   /// 受影響的行數(shù)。
  81.   int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  82.   /// 
  83.   /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到
  84.   /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。
  85.   /// 
  86.   /// 執(zhí)行的命令文本
  87.   /// IDataReader對象
  88.   IDataReader ExecuteReader(string cmdText);
  89.   /// 
  90.   /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到
  91.   /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。
  92.   /// 
  93.   /// 指定如何解析命令字符串
  94.   /// 命令文本
  95.   /// IDataParameter參數(shù)列表
  96.   /// IDataReader對象
  97.   IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  98.   /// 
  99.   /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。
  100.   /// 
  101.   /// 命令文本
  102.   /// 結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing)
  103.   object ExecuteScalar(string cmdText);
  104.   /// 
  105.   /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。
  106.   /// 
  107.   /// 指定如何解析命令字符串
  108.   /// 命令文本
  109.   /// IDataParameter參數(shù)列表
  110.   /// 結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing)。
  111.   object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  112.   /// 
  113.   /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。
  114.   /// 
  115.   /// 命令文本
  116.   /// DataTable
  117.   DataTable ExecuteTable(string cmdText);
  118.   /// 
  119.   ///執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。
  120.   /// 
  121.   /// 指定如何解析命令字符串
  122.   /// 命令文本
  123.   /// IDataParameter參數(shù)列表
  124.   /// DataTable
  125.   DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  126.   /// 
  127.   /// 關(guān)閉數(shù)據(jù)庫連接。
  128.   /// 
  129.   void Close();
  130.   /// 
  131.   /// 執(zhí)行與釋放或重置非托管資源相關(guān)的應(yīng)用程序定義的任務(wù)。
  132.   /// 
  133.   void Dispose();
  134.   }
  135.   }

  情景分析->OLEDB數(shù)據(jù)源實(shí)現(xiàn):

 
 
 
 
  1. /*----------------------------------------------------------------  
  2.  * 作者:王清培  
  3.  * 時間:2010-10-29  
  4.  * ----------------------------------------------------------------*/ 
  5. using System;  
  6. using System.Collections.Generic;  
  7. using System.Text;  
  8. using System.Configuration;  
  9. using System.Data.OleDb;  
  10. using System.Data;  
  11. namespace W.Data  
  12. {  
  13.     ///   
  14.     /// OLEDB數(shù)據(jù)源  
  15.     ///   
  16.     public sealed class OledbSource : IDataSourceType, IDisposable  
  17.     {  
  18.         #region 字段  
  19.         ///   
  20.         /// 是否已開始數(shù)據(jù)庫事務(wù)處理  
  21.         ///   
  22.         private bool _begin = false;  
  23.         ///   
  24.        /// IDbConnection對象(包裝的SqlConnection對象)  
  25.         ///   
  26.         private OleDbConnection _connection;  
  27.         ///   
  28.         /// IDbTransaction對象(包裝的SqlTransaction對象)  
  29.         ///   
  30.        private OleDbTransaction _transaction;  
  31.         ///   
  32.         /// 靜態(tài)全局(SQLServerSource數(shù)據(jù)源)實(shí)例連接字符串對象;  
  33.         ///   
  34.         private static string _globalconnectionstring = string.Empty;  
  35.        #endregion  
  36.         #region 屬性  
  37.         ///   
  38.         /// 獲取,靜態(tài)全局SQLServerSource數(shù)據(jù)源實(shí)例連接字符串對象;  
  39.         ///   
  40.         public static string GlobalConnectionString  
  41.         {  
  42.             get { return _globalconnectionstring; }  
  43.         }  
  44.         ///   
  45.         /// 獲取或設(shè)置本次執(zhí)行的數(shù)據(jù)源的連接字符串  
  46.         ///   
  47.         public string ConnectionString  
  48.         {  
  49.             get { return _connection.ConnectionString; }  
  50.             set { _connection.ConnectionString = value; }  
  51.         }  
  52.         ///   
  53.         /// 獲取包裝的SqlTransaction對象  
  54.         ///   
  55.         public OleDbTransaction SqlTransaction  
  56.         {  
  57.             get { return _transaction; }  
  58.         }  
  59.         #endregion  
  60.         #region 構(gòu)造函數(shù)  
  61.         ///   
  62.         /// 靜態(tài)構(gòu)造函數(shù)。  
  63.         ///   
  64.         static OledbSource()  
  65.         {  
  66.             //設(shè)置全局(SQLServerSource實(shí)例)對象的默認(rèn)連接字符串  
  67.             _globalconnectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;  
  68.         }  
  69.         ///   
  70.         ///默認(rèn)實(shí)例構(gòu)造函數(shù)  
  71.         ///   
  72.         public OledbSource()  
  73.         {  
  74.             _connection = new OleDbConnection(_globalconnectionstring);  
  75.         }  
  76.         ///   
  77.         /// 重載構(gòu)造函數(shù),使用指定連接字符串來初始化 CommandLib.Data.SQLServerSource  類的新實(shí)例。默認(rèn)所有的SQLServerSource實(shí)例均使用  
  78.         /// 配置文件中的SQLServerConnectionString類型的連接字符串。  
  79.         ///   
  80.         /// 連接字符串  
  81.         public OledbSource(string connectionstring)  
  82.         {  
  83.             _connection = new OleDbConnection(connectionstring);  
  84.         }  
  85.         #endregion  
  86.         #region 實(shí)例方法  
  87.         ///   
  88.         /// 開始數(shù)據(jù)庫事務(wù)。  
  89.         ///   
  90.         public void BeginTransaction()  
  91.         {  
  92.            _begin = true;  
  93.             _connection.Open();  
  94.             _transaction = _connection.BeginTransaction();//新建數(shù)據(jù)源的事務(wù)對象  
  95.         }  
  96.         ///   
  97.         /// 提交事務(wù)處理。  
  98.         ///   
  99.         public void Commit()  
  100.         {  
  101.             _begin = false;  
  102.             _transaction.Commit();  
  103.             _transaction = null;//事務(wù)執(zhí)行完畢全部清除(事務(wù)不是很常用不需要一直保留)  
  104.             _connection.Close();  
  105.         }  
  106.         ///   
  107.         /// 從掛起狀態(tài)回滾事務(wù)。  
  108.         ///   
  109.         public void Rollback()  
  110.         {  
  111.             _begin = false;  
  112.             _transaction.Rollback();  
  113.             _transaction = null;//事務(wù)執(zhí)行完畢全部清除(事務(wù)不是很常用不需要一直保留)  
  114.             _connection.Close();  
  115.         }  
  116.         ///   
  117.        ///  執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。  
  118.         ///   
  119.         /// 命令文本  
  120.         /// DataSet  
  121.         public DataSet ExecuteDataSet(string commandtext)  
  122.         {  
  123.             return ExecuteDataSet(CommandType.Text, commandtext, null);  
  124.         }  
  125.         ///   
  126.         /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataSet。  
  127.         ///   
  128.         /// 指定如何解釋命令字符串  
  129.         /// 命令文本  
  130.         /// IDbDataParameter參數(shù)列表  
  131.         /// DataSet  
  132.         public DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter)  
  133.         {  
  134.             if (_connection.State == ConnectionState.Closed)  
  135.                 _connection.Open();  
  136.             OleDbCommand commmand = InitSqlCommand(commandtype, commandtext, parameter);  
  137.             OleDbDataAdapter adapter = new OleDbDataAdapter(commmand);  
  138.             DataSet ds = new DataSet();  
  139.             adapter.Fill(ds);  
  140.             return ds;  
  141.         }  
  142.         ///   
  143.         /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。  
  144.         ///   
  145.         /// 命令文本  
  146.         /// 受影響的行數(shù)  
  147.         public int ExecuteNonQuery(string cmdText)  
  148.         {  
  149.             return ExecuteNonQuery(CommandType.Text, cmdText, null);  
  150.         }  
  151.         ///   
  152.         /// 對連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。  
  153.         ///   
  154.         /// IDbConnection對象  
  155.         /// 指定如何解析命令字符串  
  156.         /// 命令文本  
  157.         /// 受影響的行數(shù)  
  158.         public int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter)  
  159.         {  
  160.             if (_connection.State == ConnectionState.Closed)  
  161.                 _connection.Open();  
  162.             OleDbCommand command = InitSqlCommand(commandtype, commandtext, parameter);  
  163.             return command.ExecuteNonQuery();  
  164.         }  
  165.         ///   
  166.         /// 重載ExecuteNonQuery方法。  
  167.         ///   
  168.         /// IDbConnection對象  
  169.         /// 指定如何解析命令字符串  
  170.         /// 命令文本  
  171.         /// IDbDataParameter參數(shù)列表  
  172.         /// 受影響的行數(shù)  
  173.         public int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  174.         {  
  175.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  176.             command.Connection = (conn as OleDbConnection);  
  177.             return command.ExecuteNonQuery();  
  178.         }  
  179.         ///   
  180.         /// 重載ExecuteNonQuery方法。以事務(wù)的方式執(zhí)行  
  181.         ///   
  182.         /// IDbTransaction對象。  
  183.         /// 指定如何解析命令字符串。  
  184.         /// 命令文本。  
  185.         /// IDbDataParameter參數(shù)列表。  
  186.         /// 受影響的行數(shù)。  
  187.         public int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  188.         {  
  189.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  190.             command.Transaction = (trans as OleDbTransaction);  
  191.             return command.ExecuteNonQuery();  
  192.         }  
  193.         ///   
  194.         /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到  
  195.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。  
  196.         ///   
  197.         /// 執(zhí)行的命令文本  
  198.        /// IDataReader對象  
  199.         public IDataReader ExecuteReader(string cmdText)  
  200.         {  
  201.             return ExecuteReader(CommandType.Text, cmdText, null);  
  202.         }  
  203.         ///   
  204.         /// 將 System.Data.SqlClient.SqlCommand.CommandText 發(fā)送到  
  205.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。  
  206.         ///   
  207.         /// 指定如何解析命令字符串  
  208.         /// 命令文本  
  209.         /// IDataParameter參數(shù)列表  
  210.         /// IDataReader對象  
  211.         public IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  212.         {  
  213.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  214.             return command.ExecuteReader();  
  215.         }  
  216.         ///   
  217.         /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。  
  218.         ///   
  219.         /// 命令文本  
  220.         /// 結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing)  
  221.         public object ExecuteScalar(string cmdText)  
  222.         {  
  223.             return ExecuteScalar(CommandType.Text, cmdText, null);  
  224.         }  
  225.         ///   
  226.         ///  執(zhí)行查詢,并返回查詢所返回的結(jié)果集中***行的***列。忽略其他列或行。  
  227.         ///   
  228.         /// 指定如何解析命令字符串  
  229.         /// 命令文本  
  230.         /// IDataParameter參數(shù)列表  
  231.         /// 結(jié)果集中***行的***列;如果結(jié)果集為空,則為空引用(在 Visual Basic 中為 Nothing)。  
  232.         public object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  233.         {  
  234.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  235.             return command.ExecuteScalar();  
  236.         }  
  237.         ///   
  238.         /// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。  
  239.         ///   
  240.         /// 命令文本  
  241.         /// DataTable  
  242.         public DataTable ExecuteTable(string cmdText)  
  243.         {  
  244.             return ExecuteTable(CommandType.Text, cmdText, null);  
  245.         }  
  246.         ///   
  247.         ///執(zhí)行查詢,并返回查詢所返回的結(jié)果集DataTable。  
  248.         ///   
  249.         /// 指定如何解析命令字符串  
  250.         /// 命令文本  
  251.         /// IDataParameter參數(shù)列表  
  252.         /// DataTable  
  253.         public DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  254.         {  
  255.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  256.             DataTable resulttb = new DataTable();
    名稱欄目:淺談.NET策略模式
    標(biāo)題路徑:http://www.dlmjj.cn/article/djsgsdh.html