成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談.NET策略模式

開發 后端
.NET策略模式讓算法獨立于使用它的客戶而獨立變化,本文不做更深的探究,只希望大家能更多的了解策略模式。

  策略模式在我們日常開發中經常被用到,這篇文章不是策略模式的深入討論和學術研究,只是讓初學者能有個基本的了解。

  什么叫策略:1. 可以實現目標的方案集合;2. 根據形勢發展而制定的行動方針和斗爭方法;3. 有斗爭藝術,能注意方式方法。

  什么叫模式:模式(Pattern)其實就是解決某一類問題的方法論。把解決某類問題的方法總結歸納到理論高度,那就是模式。模式是一種指導,在一個良好的指導下,有助于你完成任務,有助于你作出一個優良的設計方案,達到事半功倍的效果。而且會得到解決問題的***辦法。

  什么叫策略模式:策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。

  從上面的官方解釋來看,我們已經有了一個基本的雛形。其實設計模式就是前輩們所總結出來的,用來解決某類問題的方法論;這些方法論是經過身經百戰的專家們提煉出來的,比較規范的、比較科學的模型。

  其實設計模式對初學者來說可能有點頭疼,比較抽象。大概就是因為初學者對一些概念不能深度的理解,一些理論知識還沒能夠融會貫通,不過不要緊經過一段時間的實踐鍛煉就能理解了;下面我們循環漸進的來講解什么叫策略模式。我們拿真實項目中遇到的問題來講解吧,這樣能更好的吸引注意力。

  情景引入:

  您是否遇到過這樣一個頭疼的問題,在我們開發信息系統的時候,經常需要切換不同的數據庫。但是由于我們前期開發項目的時候沒有考慮到后期的變更,所以這個時候問題就來了。如果需要更換數據庫,將大動干戈把代碼翻個底朝天。將諸如一些Sql、Oledb、Oracle之類的對象進行全局替換。這樣的設計永遠都無法滿足日后的數據庫變更需求。所以在前期設計的時候,我們就需要考慮到系統后期可能存在哪些可能變化的地方,在系統的架構上就需要變通設計(比如:依賴接口而不是具體的對象,通過依賴注入等方式進行策略的變更;)。其實這個時候我們很需要一種模式能解決此類問題,恰好前輩們為我們準備好了(策略模式)。[設計模式的設計原則:盡可能的考慮系統后期的變化;]

  1.沒有分析之前的系統結構:

情景分析:

  我們暫且不談設計模式,我們試著自己分析一下問題。我們需要一種機制,能在需要的時候自動變更后臺數據源的連接對象;我們來收集問題,既然要自動變更后臺數據源連接對象,那么我們在編碼的過程中就不能直接使用一些諸如SqlConnection、SqlCommand等對象,必須進行提取形成接口,消除類之間的強耦合。[面向對象編程原則:面向接口編程,而不是面向實現編程;]

  2.分析之后的系統結構圖:

情景分析->接口提取:

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

  情景分析->OLEDB數據源實現:

  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.     /// <summary>    
  14.     /// OLEDB數據源    
  15.     /// </summary>    
  16.     public sealed class OledbSource : IDataSourceType, IDisposable    
  17.     {    
  18.         #region 字段    
  19.         /// <summary>    
  20.         /// 是否已開始數據庫事務處理    
  21.         /// </summary>    
  22.         private bool _begin = false;    
  23.         /// <summary>    
  24.        /// IDbConnection對象(包裝的SqlConnection對象)    
  25.         /// </summary>    
  26.         private OleDbConnection _connection;    
  27.         /// <summary>    
  28.         /// IDbTransaction對象(包裝的SqlTransaction對象)    
  29.         /// </summary>    
  30.        private OleDbTransaction _transaction;    
  31.         /// <summary>    
  32.         /// 靜態全局(SQLServerSource數據源)實例連接字符串對象;    
  33.         /// </summary>    
  34.         private static string _globalconnectionstring = string.Empty;    
  35.        #endregion    
  36.         #region 屬性    
  37.         /// <summary>    
  38.         /// 獲取,靜態全局SQLServerSource數據源實例連接字符串對象;    
  39.         /// </summary>    
  40.         public static string GlobalConnectionString    
  41.         {    
  42.             get { return _globalconnectionstring; }    
  43.         }    
  44.         /// <summary>    
  45.         /// 獲取或設置本次執行的數據源的連接字符串    
  46.         /// </summary>    
  47.         public string ConnectionString    
  48.         {    
  49.             get { return _connection.ConnectionString; }    
  50.             set { _connection.ConnectionString = value; }    
  51.         }    
  52.         /// <summary>    
  53.         /// 獲取包裝的SqlTransaction對象    
  54.         /// </summary>    
  55.         public OleDbTransaction SqlTransaction    
  56.         {    
  57.             get { return _transaction; }    
  58.         }    
  59.         #endregion    
  60.         #region 構造函數    
  61.         /// <summary>    
  62.         /// 靜態構造函數。    
  63.         /// </summary>    
  64.         static OledbSource()    
  65.         {    
  66.             //設置全局(SQLServerSource實例)對象的默認連接字符串    
  67.             _globalconnectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;    
  68.         }    
  69.         /// <summary>    
  70.         ///默認實例構造函數    
  71.         /// </summary>    
  72.         public OledbSource()    
  73.         {    
  74.             _connection = new OleDbConnection(_globalconnectionstring);    
  75.         }    
  76.         /// <summary>    
  77.         /// 重載構造函數,使用指定連接字符串來初始化 CommandLib.Data.SQLServerSource  類的新實例。默認所有的SQLServerSource實例均使用    
  78.         /// 配置文件中的SQLServerConnectionString類型的連接字符串。    
  79.         /// </summary>    
  80.         /// <param name="connectionstring">連接字符串</param>    
  81.         public OledbSource(string connectionstring)    
  82.         {    
  83.             _connection = new OleDbConnection(connectionstring);    
  84.         }    
  85.         #endregion    
  86.         #region 實例方法    
  87.         /// <summary>    
  88.         /// 開始數據庫事務。    
  89.         /// </summary>    
  90.         public void BeginTransaction()    
  91.         {    
  92.            _begin = true;    
  93.             _connection.Open();    
  94.             _transaction = _connection.BeginTransaction();//新建數據源的事務對象    
  95.         }    
  96.         /// <summary>    
  97.         /// 提交事務處理。    
  98.         /// </summary>    
  99.         public void Commit()    
  100.         {    
  101.             _begin = false;    
  102.             _transaction.Commit();    
  103.             _transaction = null;//事務執行完畢全部清除(事務不是很常用不需要一直保留)    
  104.             _connection.Close();    
  105.         }    
  106.         /// <summary>    
  107.         /// 從掛起狀態回滾事務。    
  108.         /// </summary>    
  109.         public void Rollback()    
  110.         {    
  111.             _begin = false;    
  112.             _transaction.Rollback();    
  113.             _transaction = null;//事務執行完畢全部清除(事務不是很常用不需要一直保留)    
  114.             _connection.Close();    
  115.         }    
  116.         /// <summary>    
  117.        ///  執行查詢,并返回查詢所返回的結果集DataSet。    
  118.         /// </summary>    
  119.         /// <param name="commandtext">命令文本</param>    
  120.         /// <returns>DataSet</returns>    
  121.         public DataSet ExecuteDataSet(string commandtext)    
  122.         {    
  123.             return ExecuteDataSet(CommandType.Text, commandtext, null);    
  124.         }    
  125.         /// <summary>    
  126.         /// 執行查詢,并返回查詢所返回的結果集DataSet。    
  127.         /// </summary>    
  128.         /// <param name="commandtype">指定如何解釋命令字符串</param>    
  129.         /// <param name="commandtext">命令文本</param>    
  130.         /// <param name="parameter">IDbDataParameter參數列表</param>    
  131.         /// <returns>DataSet</returns>    
  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.         /// <summary>    
  143.         /// 對連接執行 Transact-SQL 語句并返回受影響的行數。    
  144.         /// </summary>    
  145.         /// <param name="cmdText">命令文本</param>    
  146.         /// <returns>受影響的行數</returns>    
  147.         public int ExecuteNonQuery(string cmdText)    
  148.         {    
  149.             return ExecuteNonQuery(CommandType.Text, cmdText, null);    
  150.         }    
  151.         /// <summary>    
  152.         /// 對連接執行 Transact-SQL 語句并返回受影響的行數。    
  153.         /// </summary>    
  154.         /// <param name="commandtype">IDbConnection對象</param>    
  155.         /// <param name="commandtext">指定如何解析命令字符串</param>    
  156.         /// <param name="parameter">命令文本</param>    
  157.         /// <returns>受影響的行數</returns>    
  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.         /// <summary>    
  166.         /// 重載ExecuteNonQuery方法。    
  167.         /// </summary>    
  168.         /// <param name="conn">IDbConnection對象</param>    
  169.         /// <param name="cmdType">指定如何解析命令字符串</param>    
  170.         /// <param name="cmdText">命令文本</param>    
  171.         /// <param name="commandParameters">IDbDataParameter參數列表</param>    
  172.         /// <returns>受影響的行數</returns>    
  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.         /// <summary>    
  180.         /// 重載ExecuteNonQuery方法。以事務的方式執行    
  181.         /// </summary>    
  182.         /// <param name="trans">IDbTransaction對象。</param>    
  183.         /// <param name="cmdType">指定如何解析命令字符串。</param>    
  184.         /// <param name="cmdText">命令文本。</param>    
  185.         /// <param name="commandParameters">IDbDataParameter參數列表。</param>    
  186.         /// <returns>受影響的行數。</returns>    
  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.         /// <summary>    
  194.         /// 將 System.Data.SqlClient.SqlCommand.CommandText 發送到    
  195.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。    
  196.         /// </summary>    
  197.         /// <param name="cmdText">執行的命令文本</param>    
  198.        /// <returns>IDataReader對象</returns>    
  199.         public IDataReader ExecuteReader(string cmdText)    
  200.         {    
  201.             return ExecuteReader(CommandType.Text, cmdText, null);    
  202.         }    
  203.         /// <summary>    
  204.         /// 將 System.Data.SqlClient.SqlCommand.CommandText 發送到    
  205.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一個 System.Data.SqlClient.SqlDataReader。    
  206.         /// </summary>    
  207.         /// <param name="cmdType">指定如何解析命令字符串</param>    
  208.         /// <param name="cmdText">命令文本</param>    
  209.         /// <param name="commandParameters">IDataParameter參數列表</param>    
  210.         /// <returns>IDataReader對象</returns>    
  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.         /// <summary>    
  217.         /// 執行查詢,并返回查詢所返回的結果集中***行的***列。忽略其他列或行。    
  218.         /// </summary>    
  219.         /// <param name="cmdText">命令文本</param>    
  220.         /// <returns>結果集中***行的***列;如果結果集為空,則為空引用(在 Visual Basic 中為 Nothing)</returns>    
  221.         public object ExecuteScalar(string cmdText)    
  222.         {    
  223.             return ExecuteScalar(CommandType.Text, cmdText, null);    
  224.         }    
  225.         /// <summary>    
  226.         ///  執行查詢,并返回查詢所返回的結果集中***行的***列。忽略其他列或行。    
  227.         /// </summary>    
  228.         /// <param name="cmdType">指定如何解析命令字符串</param>    
  229.         /// <param name="cmdText">命令文本</param>    
  230.         /// <param name="commandParameters">IDataParameter參數列表</param>    
  231.         /// <returns>結果集中***行的***列;如果結果集為空,則為空引用(在 Visual Basic 中為 Nothing)。</returns>    
  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.         /// <summary>    
  238.         /// 執行查詢,并返回查詢所返回的結果集DataTable。    
  239.         /// </summary>    
  240.         /// <param name="cmdText">命令文本</param>    
  241.         /// <returns>DataTable</returns>    
  242.         public DataTable ExecuteTable(string cmdText)    
  243.         {    
  244.             return ExecuteTable(CommandType.Text, cmdText, null);    
  245.         }    
  246.         /// <summary>    
  247.         ///執行查詢,并返回查詢所返回的結果集DataTable。    
  248.         /// </summary>    
  249.         /// <param name="cmdType">指定如何解析命令字符串</param>    
  250.         /// <param name="cmdText">命令文本</param>    
  251.         /// <param name="commandParameters">IDataParameter參數列表</param>    
  252.         /// <returns>DataTable</returns>    
  253.         public DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter)    
  254.         {    
  255.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);    
  256.             DataTable resulttb = new DataTable();    
  257.             OleDbDataAdapter adapter = new OleDbDataAdapter(command);    
  258.             adapter.Fill(resulttb);    
  259.             return resulttb;    
  260.         }    
  261.         /// <summary>    
  262.         /// 私有方法實現內部類的SqlCommand的初始化    
  263.         /// </summary>    
  264.         /// <param name="commandtype">IDbConnection對象</param>    
  265.         /// <param name="commandtext">指定如何解析命令字符串</param>    
  266.         /// <param name="parameter">命令文本</param>    
  267.         /// <returns>SqlCommand</returns>    
  268.         private OleDbCommand InitSqlCommand(CommandType commandtype, string commandtext, params IDataParameter[] parameter)    
  269.         {    
  270.             OleDbCommand command = new OleDbCommand(commandtext, _connection);    
  271.             command.CommandType = commandtype;    
  272.             if (_transaction != null)    
  273.                 command.Transaction = _transaction;    
  274.             if (parameter != null)    
  275.                 command.Parameters.AddRange(parameter);    
  276.             return command;    
  277.         }    
  278.         /// <summary>    
  279.         /// 關閉數據庫連接。    
  280.         /// </summary>    
  281.         public void Close()    
  282.         {    
  283.             _connection.Close();    
  284.         }    
  285.         /// <summary>    
  286.         /// 執行與釋放或重置非托管資源相關的應用程序定義的任務。    
  287.         /// </summary>    
  288.         public void Dispose()    
  289.         {    
  290.             _connection.Dispose();    
  291.         }    
  292.         #endregion    
  293.     }    
  294. }  

 

  這段代碼來源我自己的ORM框架中的。我假設實現一個Oledb數據源。但是怎么將對象送給前臺調用者呢,方法有很多中可以通過工廠、IOC控制器、策略方法都可以,我是用的工廠實現的;這里我就不貼出代碼了,給出調用代碼吧,可以完整的結束了;

  情景分析->調用代碼:

  1.   /// <summary>
  2.   /// 根據實體對象和IDataSourceType對象刪除一條記錄,
  3.   /// 該實體必須明確主鍵值才能刪除記錄;如果該實體沒有主鍵可自己編寫SQL代碼刪除;
  4.   /// </summary>
  5.   /// <typeparam name="T">要刪除的表對應的實體對象</typeparam>
  6.   /// <param name="t">Model實體</param>
  7.   /// <param name="idatasource">IDataSourceType數據源類型對象</param>
  8.   /// <returns>刪除是否成功;1成功,0失敗</returns>
  9.   public static int DeleteModelById<T>(T t, IDataSourceType idatasource) where T : new()
  10.   {
  11.   string sqlstring;//保存要執行的T-SQL語句
  12.   List<IDataParameter> paramlist = (List<IDataParameter>)GetDeleteModelParameterT_SQL<T>(t, out sqlstring);//獲取利用Model刪除時的語句和參數列表
  13.   if (idatasource != null)
  14.   return idatasource.ExecuteNonQuery(CommandType.Text, sqlstring, paramlist.ToArray());
  15.   return IDataSourceTypeFactory.Create().ExecuteNonQuery(CommandType.Text, sqlstring, paramlist.ToArray());
  16.   }

  總結:調用程序使用接口統一調用數據源不需要關心后臺是什么數據源,工廠通過在策略集合中找到合適的策略給調用著;策略模式大概就講完了,謝謝。

原文鏈接:http://www.cnblogs.com/wangiqngpei557/archive/2011/07/20/2111450.html

【編輯推薦】

  1. 看老外程序員如何向妻子解釋OOD
  2. 看老外程序員如何向妻子解釋設計模式
  3. 同是80后程序員 為什么差距卻如此大
  4. 設計模式 UML簡介
  5. 老Web前端設計者談對div絕對定位的心得

 

責任編輯:彭凡 來源: 博客園
相關推薦

2012-04-24 09:55:29

.NET

2009-06-26 10:48:45

職責鏈模式.NET

2009-07-24 10:52:42

ASP.NET ISA

2009-07-20 15:30:11

ASP.NET應用

2009-07-22 16:11:43

ASP.NET AJA

2009-10-14 12:51:41

VB.NET Data

2010-09-27 10:57:05

2013-11-26 16:09:34

Android設計模式

2024-12-09 09:40:00

策略模式Java

2024-09-11 08:56:50

ASP多身份校驗

2009-07-28 17:49:30

ASP.NET定期回收

2011-06-28 09:51:08

.NET對象相等

2009-07-22 13:24:24

ASP.NET MVC

2009-08-10 10:19:47

ASP.NET組件設計

2009-07-23 15:44:39

ASP.NET MVC

2009-07-20 17:12:17

ASP.NET訪問數據

2009-08-05 15:29:33

ASP.NET For

2009-07-10 13:09:53

.Net與Java S

2009-07-28 16:03:23

ASP.NET狀態服務

2009-10-20 09:39:04

VB.NET Butt
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美中文字幕在线观看 | 欧洲成人午夜免费大片 | 国产精品久久久久久久久久久免费看 | 欧美综合一区 | 日本xx视频免费观看 | 夜操| 欧美精品一区二区三区四区 在线 | 亚洲成人中文字幕 | av手机在线免费观看 | 国产精品成人在线播放 | 天天干天天插 | 日韩国产欧美 | 午夜免费视频观看 | 久久久蜜臀国产一区二区 | 久草在线青青草 | 久久久精品亚洲 | 老外黄色一级片 | 成人午夜影院 | 国产精品美女久久久av超清 | 久久精彩视频 | 日韩一区中文字幕 | 欧美日韩网站 | 欧美日在线 | 亚州影院| 日韩欧美三区 | 婷婷在线视频 | 一区二区三区免费 | 国产一区二区三区在线观看免费 | 黄网站涩免费蜜桃网站 | 日日干干夜夜 | 国产在线观看一区二区 | 一区二区三区亚洲精品国 | 国产精品一区二区久久久久 | 视频精品一区二区三区 | 亚洲v区 | 特级a欧美做爰片毛片 | 国产露脸国语对白在线 | 亚洲性视频网站 | 久久婷婷国产香蕉 | 成人性生交大片免费看r链接 | 黄色片视频|