.NET简谈策略模式

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

策略模式在我们日常开发中经常被用到,这篇文章不是策略模式的深入讨论和学术研究,只是让初学者能有个基本的了解。

什么叫策略: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.  
  11. namespace W.Data  
  12. {  
  13.     /// <summary>  
  14.     /// 通用数据源类型接口,  
  15.     /// 确定每种数据源必须实现基本的对IDbConnection,IDbCommand,IDbTransaction 三者的包装;  
  16.     /// </summary>  
  17.     public interface IDataSourceType  
  18.     {  
  19.         #region 属性  
  20.         /// <summary>  
  21.         /// 获取或设置数据源连接字符串。  
  22.         /// </summary>  
  23.         string ConnectionString { getset; }  
  24.         #endregion  
  25.         /// <summary>  
  26.         /// 开始数据库事务。  
  27.         /// </summary>  
  28.         void BeginTransaction();  
  29.         /// <summary>  
  30.         /// 提交事务处理。  
  31.         /// </summary>  
  32.         void Commit();  
  33.         /// <summary>  
  34.         /// 从挂起状态回滚事务。  
  35.         /// </summary>  
  36.         void Rollback();  
  37.         /// <summary>  
  38.         /// 执行查询,并返回查询所返回的结果集DataSet。  
  39.         /// </summary>  
  40.         /// <param name="cmdText">要执行的命令文本</param>  
  41.         /// <returns>DataSet</returns>  
  42.         DataSet ExecuteDataSet(string commandtext);  
  43.         /// <summary>  
  44.         /// 执行查询,并返回查询所返回的结果集DataSet。  
  45.         /// </summary>  
  46.         /// <param name="commandtype"> 指定如何解释命令字符串。</param>  
  47.         /// <param name="commandtext">命令文本</param>  
  48.         /// <param name="parameter">IDbDataParameter参数列表</param>  
  49.         /// <returns>DataSet</returns>  
  50.         DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter);  
  51.         /// <summary>  
  52.         /// 对连接执行 Transact-SQL 语句并返回受影响的行数。  
  53.         /// </summary>  
  54.         /// <param name="cmdText">命令文本</param>  
  55.         /// <returns>受影响的行数</returns>  
  56.         int ExecuteNonQuery(string cmdText);  
  57.         /// <summary>  
  58.         /// 对连接执行 Transact-SQL 语句并返回受影响的行数。  
  59.         /// </summary>  
  60.         /// <param name="commandtype">指定如何解析命令字符串</param>  
  61.         /// <param name="commandtext">命令文本</param>  
  62.         /// <param name="parameter">IDbDataParameter参数列表</param>  
  63.         /// <returns>受影响的行数</returns>  
  64.         int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter);  
  65.         /// <summary>  
  66.         /// 对连接执行 Transact-SQL 语句并返回受影响的行数。  
  67.         /// </summary>  
  68.         /// <param name="conn">IDbConnection对象</param>  
  69.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  70.         /// <param name="cmdText">命令文本</param>  
  71.         /// <param name="commandParameters">IDbDataParameter参数列表</param>  
  72.         /// <returns>受影响的行数</returns>  
  73.         int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter);  
  74.         /// <summary>  
  75.         ///对连接执行 Transact-SQL 语句并返回受影响的行数。已事务的方式执行  
  76.         /// </summary>  
  77.         /// <param name="trans">IDbTransaction对象。</param>  
  78.         /// <param name="cmdType">指定如何解析命令字符串。</param>  
  79.         /// <param name="cmdText">命令文本。</param>  
  80.         /// <param name="commandParameters">IDbDataParameter参数列表。</param>  
  81.         /// <returns>受影响的行数。</returns>  
  82.         int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter);  
  83.         /// <summary>  
  84.         /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到  
  85.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。  
  86.         /// </summary>  
  87.         /// <param name="cmdText">执行的命令文本</param>  
  88.         /// <returns>IDataReader对象</returns>  
  89.         IDataReader ExecuteReader(string cmdText);  
  90.         /// <summary>  
  91.         /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到  
  92.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。  
  93.         /// </summary>  
  94.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  95.         /// <param name="cmdText">命令文本</param>  
  96.         /// <param name="commandParameters">IDataParameter参数列表</param>  
  97.         /// <returns>IDataReader对象</returns>  
  98.         IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter);  
  99.         /// <summary>  
  100.         /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。  
  101.         /// </summary>  
  102.         /// <param name="cmdText">命令文本</param>  
  103.         /// <returns>结果集中第一行的第一列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)</returns>  
  104.         object ExecuteScalar(string cmdText);  
  105.         /// <summary>  
  106.         ///  执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。  
  107.         /// </summary>  
  108.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  109.         /// <param name="cmdText">命令文本</param>  
  110.         /// <param name="commandParameters">IDataParameter参数列表</param>  
  111.         /// <returns>结果集中第一行的第一列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)。</returns>  
  112.         object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter);  
  113.         /// <summary>  
  114.         /// 执行查询,并返回查询所返回的结果集DataTable。  
  115.         /// </summary>  
  116.         /// <param name="cmdText">命令文本</param>  
  117.         /// <returns>DataTable</returns>  
  118.         DataTable ExecuteTable(string cmdText);  
  119.         /// <summary>  
  120.         ///执行查询,并返回查询所返回的结果集DataTable。  
  121.         /// </summary>  
  122.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  123.         /// <param name="cmdText">命令文本</param>  
  124.         /// <param name="commandParameters">IDataParameter参数列表</param>  
  125.         /// <returns>DataTable</returns>  
  126.         DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter);  
  127.         /// <summary>  
  128.         /// 关闭数据库连接。  
  129.         /// </summary>  
  130.         void Close();  
  131.         /// <summary>  
  132.         /// 执行与释放或重置非托管资源相关的应用程序定义的任务。  
  133.         /// </summary>  
  134.         void Dispose();  
  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.  
  12. namespace W.Data  
  13. {  
  14.     /// <summary>  
  15.     /// OLEDB数据源  
  16.     /// </summary>  
  17.     public sealed class OledbSource : IDataSourceType, IDisposable  
  18.     {  
  19.         #region 字段  
  20.         /// <summary>  
  21.         /// 是否已开始数据库事务处理  
  22.         /// </summary>  
  23.         private bool _begin = false;  
  24.         /// <summary>  
  25.         /// IDbConnection对象(包装的SqlConnection对象)  
  26.         /// </summary>  
  27.         private OleDbConnection _connection;  
  28.         /// <summary>  
  29.         /// IDbTransaction对象(包装的SqlTransaction对象)  
  30.         /// </summary>  
  31.         private OleDbTransaction _transaction;  
  32.         /// <summary>  
  33.         /// 静态全局(SQLServerSource数据源)实例连接字符串对象;  
  34.         /// </summary>  
  35.         private static string _globalconnectionstring = string.Empty;  
  36.  
  37.         #endregion  
  38.  
  39.         #region 属性  
  40.         /// <summary>  
  41.         /// 获取,静态全局SQLServerSource数据源实例连接字符串对象;  
  42.         /// </summary>  
  43.         public static string GlobalConnectionString  
  44.         {  
  45.             get { return _globalconnectionstring; }  
  46.         }  
  47.         /// <summary>  
  48.         /// 获取或设置本次执行的数据源的连接字符串  
  49.         /// </summary>  
  50.         public string ConnectionString  
  51.         {  
  52.             get { return _connection.ConnectionString; }  
  53.             set { _connection.ConnectionString = value; }  
  54.         }  
  55.         /// <summary>  
  56.         /// 获取包装的SqlTransaction对象  
  57.         /// </summary>  
  58.         public OleDbTransaction SqlTransaction  
  59.         {  
  60.             get { return _transaction; }  
  61.         }  
  62.         #endregion  
  63.  
  64.         #region 构造函数  
  65.         /// <summary>  
  66.         /// 静态构造函数。  
  67.         /// </summary>  
  68.         static OledbSource()  
  69.         {  
  70.             //设置全局(SQLServerSource实例)对象的默认连接字符串  
  71.             _globalconnectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;  
  72.         }  
  73.         /// <summary>  
  74.         ///默认实例构造函数  
  75.         /// </summary>  
  76.         public OledbSource()  
  77.         {  
  78.             _connection = new OleDbConnection(_globalconnectionstring);  
  79.         }  
  80.         /// <summary>  
  81.         /// 重载构造函数,使用指定连接字符串来初始化 CommandLib.Data.SQLServerSource  类的新实例。默认所有的SQLServerSource实例均使用  
  82.         /// 配置文件中的SQLServerConnectionString类型的连接字符串。  
  83.         /// </summary>  
  84.         /// <param name="connectionstring">连接字符串</param>  
  85.         public OledbSource(string connectionstring)  
  86.         {  
  87.             _connection = new OleDbConnection(connectionstring);  
  88.         }  
  89.         #endregion  
  90.  
  91.         #region 实例方法  
  92.         /// <summary>  
  93.         /// 开始数据库事务。  
  94.         /// </summary>  
  95.         public void BeginTransaction()  
  96.         {  
  97.             _begin = true;  
  98.             _connection.Open();  
  99.             _transaction = _connection.BeginTransaction();//新建数据源的事务对象  
  100.         }  
  101.         /// <summary>  
  102.         /// 提交事务处理。  
  103.         /// </summary>  
  104.         public void Commit()  
  105.         {  
  106.             _begin = false;  
  107.             _transaction.Commit();  
  108.             _transaction = null;//事务执行完毕全部清除(事务不是很常用不需要一直保留)  
  109.             _connection.Close();  
  110.         }  
  111.         /// <summary>  
  112.         /// 从挂起状态回滚事务。  
  113.         /// </summary>  
  114.         public void Rollback()  
  115.         {  
  116.             _begin = false;  
  117.             _transaction.Rollback();  
  118.             _transaction = null;//事务执行完毕全部清除(事务不是很常用不需要一直保留)  
  119.             _connection.Close();  
  120.         }  
  121.         /// <summary>  
  122.         ///  执行查询,并返回查询所返回的结果集DataSet。  
  123.         /// </summary>  
  124.         /// <param name="commandtext">命令文本</param>  
  125.         /// <returns>DataSet</returns>  
  126.         public DataSet ExecuteDataSet(string commandtext)  
  127.         {  
  128.             return ExecuteDataSet(CommandType.Text, commandtext, null);  
  129.         }  
  130.         /// <summary>  
  131.         /// 执行查询,并返回查询所返回的结果集DataSet。  
  132.         /// </summary>  
  133.         /// <param name="commandtype">指定如何解释命令字符串</param>  
  134.         /// <param name="commandtext">命令文本</param>  
  135.         /// <param name="parameter">IDbDataParameter参数列表</param>  
  136.         /// <returns>DataSet</returns>  
  137.         public DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter)  
  138.         {  
  139.             if (_connection.State == ConnectionState.Closed)  
  140.                 _connection.Open();  
  141.             OleDbCommand commmand = InitSqlCommand(commandtype, commandtext, parameter);  
  142.             OleDbDataAdapter adapter = new OleDbDataAdapter(commmand);  
  143.             DataSet ds = new DataSet();  
  144.             adapter.Fill(ds);  
  145.             return ds;  
  146.         }  
  147.         /// <summary>  
  148.         /// 对连接执行 Transact-SQL 语句并返回受影响的行数。  
  149.         /// </summary>  
  150.         /// <param name="cmdText">命令文本</param>  
  151.         /// <returns>受影响的行数</returns>  
  152.         public int ExecuteNonQuery(string cmdText)  
  153.         {  
  154.             return ExecuteNonQuery(CommandType.Text, cmdText, null);  
  155.         }  
  156.         /// <summary>  
  157.         /// 对连接执行 Transact-SQL 语句并返回受影响的行数。  
  158.         /// </summary>  
  159.         /// <param name="commandtype">IDbConnection对象</param>  
  160.         /// <param name="commandtext">指定如何解析命令字符串</param>  
  161.         /// <param name="parameter">命令文本</param>  
  162.         /// <returns>受影响的行数</returns>  
  163.         public int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter)  
  164.         {  
  165.             if (_connection.State == ConnectionState.Closed)  
  166.                 _connection.Open();  
  167.             OleDbCommand command = InitSqlCommand(commandtype, commandtext, parameter);  
  168.             return command.ExecuteNonQuery();  
  169.  
  170.         }  
  171.         /// <summary>  
  172.         /// 重载ExecuteNonQuery方法。  
  173.         /// </summary>  
  174.         /// <param name="conn">IDbConnection对象</param>  
  175.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  176.         /// <param name="cmdText">命令文本</param>  
  177.         /// <param name="commandParameters">IDbDataParameter参数列表</param>  
  178.         /// <returns>受影响的行数</returns>  
  179.         public int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  180.         {  
  181.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  182.             command.Connection = (conn as OleDbConnection);  
  183.             return command.ExecuteNonQuery();  
  184.  
  185.         }  
  186.         /// <summary>  
  187.         /// 重载ExecuteNonQuery方法。以事务的方式执行  
  188.         /// </summary>  
  189.         /// <param name="trans">IDbTransaction对象。</param>  
  190.         /// <param name="cmdType">指定如何解析命令字符串。</param>  
  191.         /// <param name="cmdText">命令文本。</param>  
  192.         /// <param name="commandParameters">IDbDataParameter参数列表。</param>  
  193.         /// <returns>受影响的行数。</returns>  
  194.         public int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  195.         {  
  196.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  197.             command.Transaction = (trans as OleDbTransaction);  
  198.             return command.ExecuteNonQuery();  
  199.         }  
  200.         /// <summary>  
  201.         /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到  
  202.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。  
  203.         /// </summary>  
  204.         /// <param name="cmdText">执行的命令文本</param>  
  205.         /// <returns>IDataReader对象</returns>  
  206.         public IDataReader ExecuteReader(string cmdText)  
  207.         {  
  208.             return ExecuteReader(CommandType.Text, cmdText, null);  
  209.         }  
  210.         /// <summary>  
  211.         /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到  
  212.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。  
  213.         /// </summary>  
  214.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  215.         /// <param name="cmdText">命令文本</param>  
  216.         /// <param name="commandParameters">IDataParameter参数列表</param>  
  217.         /// <returns>IDataReader对象</returns>  
  218.         public IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  219.         {  
  220.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  221.             return command.ExecuteReader();  
  222.         }  
  223.         /// <summary>  
  224.         /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。  
  225.         /// </summary>  
  226.         /// <param name="cmdText">命令文本</param>  
  227.         /// <returns>结果集中第一行的第一列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)</returns>  
  228.         public object ExecuteScalar(string cmdText)  
  229.         {  
  230.             return ExecuteScalar(CommandType.Text, cmdText, null);  
  231.         }  
  232.         /// <summary>  
  233.         ///  执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。  
  234.         /// </summary>  
  235.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  236.         /// <param name="cmdText">命令文本</param>  
  237.         /// <param name="commandParameters">IDataParameter参数列表</param>  
  238.         /// <returns>结果集中第一行的第一列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)。</returns>  
  239.         public object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  240.         {  
  241.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  242.             return command.ExecuteScalar();  
  243.         }  
  244.         /// <summary>  
  245.         /// 执行查询,并返回查询所返回的结果集DataTable。  
  246.         /// </summary>  
  247.         /// <param name="cmdText">命令文本</param>  
  248.         /// <returns>DataTable</returns>  
  249.         public DataTable ExecuteTable(string cmdText)  
  250.         {  
  251.             return ExecuteTable(CommandType.Text, cmdText, null);  
  252.         }  
  253.         /// <summary>  
  254.         ///执行查询,并返回查询所返回的结果集DataTable。  
  255.         /// </summary>  
  256.         /// <param name="cmdType">指定如何解析命令字符串</param>  
  257.         /// <param name="cmdText">命令文本</param>  
  258.         /// <param name="commandParameters">IDataParameter参数列表</param>  
  259.         /// <returns>DataTable</returns>  
  260.         public DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter)  
  261.         {  
  262.             OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);  
  263.             DataTable resulttb = new DataTable();  
  264.             OleDbDataAdapter adapter = new OleDbDataAdapter(command);  
  265.             adapter.Fill(resulttb);  
  266.             return resulttb;  
  267.         }  
  268.         /// <summary>  
  269.         /// 私有方法实现内部类的SqlCommand的初始化  
  270.         /// </summary>  
  271.         /// <param name="commandtype">IDbConnection对象</param>  
  272.         /// <param name="commandtext">指定如何解析命令字符串</param>  
  273.         /// <param name="parameter">命令文本</param>  
  274.         /// <returns>SqlCommand</returns>  
  275.         private OleDbCommand InitSqlCommand(CommandType commandtype, string commandtext, params IDataParameter[] parameter)  
  276.         {  
  277.             OleDbCommand command = new OleDbCommand(commandtext, _connection);  
  278.             command.CommandType = commandtype;  
  279.             if (_transaction != null)  
  280.                 command.Transaction = _transaction;  
  281.             if (parameter != null)  
  282.                 command.Parameters.AddRange(parameter);  
  283.             return command;  
  284.         }  
  285.         /// <summary>  
  286.         /// 关闭数据库连接。  
  287.         /// </summary>  
  288.         public void Close()  
  289.         {  
  290.             _connection.Close();  
  291.         }  
  292.         /// <summary>  
  293.         /// 执行与释放或重置非托管资源相关的应用程序定义的任务。  
  294.         /// </summary>  
  295.         public void Dispose()  
  296.         {  
  297.             _connection.Dispose();  
  298.         }  
  299.         #endregion  
  300.     }  
  301. }  

这段代码来源我自己的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.         } 
总结:调用程序使用接口统一调用数据源不需要关心后台是什么数据源,工厂通过在策略集合中找到合适的策略给调用着;策略模式大概就讲完了,谢谢;



 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/617885 ,如需转载请自行联系原作者



相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
一起谈.NET技术,.NET简谈面向接口编程
  过程式的开发方式已逐渐退出大众的眼线,随之而来的是各种各样的高抽象的开发模式;我们不得不承认在没有设计模式的时候,我们很难总结出有价值的开发模型,便于以后重复使用和推广;面向对象的流行,让我们开发人员重新站在一个高的起点来看待软件模型,抽象固然是好事,但是也给初学者带来了迷惑,将软件中的东西都想成很简单的封装,我们只需要调用就行,这样越来越多的开发人员开始慢慢的往上浮,有一定编程经验和感触的人,能够明白我所说的浮,也算是给初学者提个醒吧。
993 0
.NET“.NET研究”简谈面向接口编程
  过程式的开发方式已逐渐退出大众的眼线,随之而来的是各种各样的高抽象的开发模式;我们不得不承认在没有设计模式的时候,我们很难总结出有价值的开发模型,便于以后重复使用和推广;面向对象的流行,让我们开发人员重新站在一个高的起点来看待软件模型,抽象固然是好事,但是也给初学者带来了迷惑,将软件中的东西都想成很简单的封装,我们只需要调用就行,这样越来越多的开发人员开始慢慢的往上浮,有一定编程经验和感触的人,能够明白我所说的浮,也算上海闵行企业网站设计与制作是给初学者提个醒吧。
988 0
|
容器
一起谈.NET技术,.NET简谈观察者模式
  观察者模式想必搞程序开发的都听说过,今天我也来简单的总结一下本人在程序开发过程中是怎么使用观察者模式的;希望给大家带来点新的想法,如果哪位高手看到了也不要嘲笑啊;呵呵,追求技术的人,始终都是为了技术而学技术,目的只有一个,一起追求技术的最高境界。
776 0