浅谈.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

2013-11-26 16:09:34

Android设计模式

2010-09-27 10:57:05

2021-06-09 08:53:34

设计模式策略模式工厂模式

2015-09-08 13:39:10

JavaScript设计模式

2009-07-24 10:52:42

ASP.NET ISA

2009-07-22 16:11:43

ASP.NET AJA

2009-10-14 12:51:41

VB.NET Data

2009-07-20 15:30:11

ASP.NET应用

2011-09-09 13:29:15

思科网络管理CiscoCiscoPrim

2014-03-11 15:47:29

大型网站速度优化运维人员

2010-09-30 09:27:18

企业反垃圾邮件

2009-02-12 17:02:49

2009-02-06 09:56:56

软件测试数据仓库测试开发与执行

2020-06-08 08:04:49

设计模式结构型接口

2012-08-30 09:07:33

设计模式

2009-08-05 15:29:33

ASP.NET For

2009-08-10 10:19:47

ASP.NET组件设计

2011-06-28 09:51:08

.NET对象相等
点赞
收藏

51CTO技术栈公众号