浅谈.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.   /// 
  13.   /// 通用数据源类型接口,
  14.   /// 确定每种数据源必须实现基本的对IDbConnection,IDbCommand,IDbTransaction 三者的包装;
  15.   /// 
  16.   public interface IDataSourceType
  17.   {
  18.   #region 属性
  19.   /// 
  20.   /// 获取或设置数据源连接字符串。
  21.   /// 
  22.   string ConnectionString { get; set; }
  23.   #endregion
  24.   /// 
  25.   /// 开始数据库事务。
  26.   /// 
  27.   void BeginTransaction();
  28.   /// 
  29.   /// 提交事务处理。
  30.   /// 
  31.   void Commit();
  32.   /// 
  33.   /// 从挂起状态回滚事务。
  34.   /// 
  35.   void Rollback();
  36.   /// 
  37.   /// 执行查询,并返回查询所返回的结果集DataSet。
  38.   /// 
  39.   /// 要执行的命令文本
  40.   /// DataSet
  41.   DataSet ExecuteDataSet(string commandtext);
  42.   /// 
  43.   /// 执行查询,并返回查询所返回的结果集DataSet。
  44.   /// 
  45.   ///  指定如何解释命令字符串。
  46.   /// 命令文本
  47.   /// IDbDataParameter参数列表
  48.   /// DataSet
  49.   DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
  50.   /// 
  51.   /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
  52.   /// 
  53.   /// 命令文本
  54.   /// 受影响的行数
  55.   int ExecuteNonQuery(string cmdText);
  56.   /// 
  57.   /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
  58.   /// 
  59.   /// 指定如何解析命令字符串
  60.   /// 命令文本
  61.   /// IDbDataParameter参数列表
  62.   /// 受影响的行数
  63.   int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
  64.   /// 
  65.   /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
  66.   /// 
  67.  /// IDbConnection对象
  68.  /// 指定如何解析命令字符串
  69.   /// 命令文本
  70.   /// IDbDataParameter参数列表
  71.  /// 受影响的行数
  72.   int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  73.   /// 
  74.   ///对连接执行 Transact-SQL 语句并返回受影响的行数。已事务的方式执行
  75.   /// 
  76.   /// IDbTransaction对象。
  77.   /// 指定如何解析命令字符串。
  78.   /// 命令文本。
  79.   /// IDbDataParameter参数列表。
  80.   /// 受影响的行数。
  81.   int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  82.   /// 
  83.   /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到
  84.   /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。
  85.   /// 
  86.   /// 执行的命令文本
  87.   /// IDataReader对象
  88.   IDataReader ExecuteReader(string cmdText);
  89.   /// 
  90.   /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到
  91.   /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。
  92.   /// 
  93.   /// 指定如何解析命令字符串
  94.   /// 命令文本
  95.   /// IDataParameter参数列表
  96.   /// IDataReader对象
  97.   IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  98.   /// 
  99.   /// 执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。
  100.   /// 
  101.   /// 命令文本
  102.   /// 结果集中***行的***列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)
  103.   object ExecuteScalar(string cmdText);
  104.   /// 
  105.   /// 执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。
  106.   /// 
  107.   /// 指定如何解析命令字符串
  108.   /// 命令文本
  109.   /// IDataParameter参数列表
  110.   /// 结果集中***行的***列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)。
  111.   object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  112.   /// 
  113.   /// 执行查询,并返回查询所返回的结果集DataTable。
  114.   /// 
  115.   /// 命令文本
  116.   /// DataTable
  117.   DataTable ExecuteTable(string cmdText);
  118.   /// 
  119.   ///执行查询,并返回查询所返回的结果集DataTable。
  120.   /// 
  121.   /// 指定如何解析命令字符串
  122.   /// 命令文本
  123.   /// IDataParameter参数列表
  124.   /// DataTable
  125.   DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
  126.   /// 
  127.   /// 关闭数据库连接。
  128.   /// 
  129.   void Close();
  130.   /// 
  131.   /// 执行与释放或重置非托管资源相关的应用程序定义的任务。
  132.   /// 
  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.     ///   
  14.     /// OLEDB数据源  
  15.     ///   
  16.     public sealed class OledbSource : IDataSourceType, IDisposable  
  17.     {  
  18.         #region 字段  
  19.         ///   
  20.         /// 是否已开始数据库事务处理  
  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.         /// 静态全局(SQLServerSource数据源)实例连接字符串对象;  
  33.         ///   
  34.         private static string _globalconnectionstring = string.Empty;  
  35.        #endregion  
  36.         #region 属性  
  37.         ///   
  38.         /// 获取,静态全局SQLServerSource数据源实例连接字符串对象;  
  39.         ///   
  40.         public static string GlobalConnectionString  
  41.         {  
  42.             get { return _globalconnectionstring; }  
  43.         }  
  44.         ///   
  45.         /// 获取或设置本次执行的数据源的连接字符串  
  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 构造函数  
  61.         ///   
  62.         /// 静态构造函数。  
  63.         ///   
  64.         static OledbSource()  
  65.         {  
  66.             //设置全局(SQLServerSource实例)对象的默认连接字符串  
  67.             _globalconnectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;  
  68.         }  
  69.         ///   
  70.         ///默认实例构造函数  
  71.         ///   
  72.         public OledbSource()  
  73.         {  
  74.             _connection = new OleDbConnection(_globalconnectionstring);  
  75.         }  
  76.         ///   
  77.         /// 重载构造函数,使用指定连接字符串来初始化 CommandLib.Data.SQLServerSource  类的新实例。默认所有的SQLServerSource实例均使用  
  78.         /// 配置文件中的SQLServerConnectionString类型的连接字符串。  
  79.         ///   
  80.         /// 连接字符串  
  81.         public OledbSource(string connectionstring)  
  82.         {  
  83.             _connection = new OleDbConnection(connectionstring);  
  84.         }  
  85.         #endregion  
  86.         #region 实例方法  
  87.         ///   
  88.         /// 开始数据库事务。  
  89.         ///   
  90.         public void BeginTransaction()  
  91.         {  
  92.            _begin = true;  
  93.             _connection.Open();  
  94.             _transaction = _connection.BeginTransaction();//新建数据源的事务对象  
  95.         }  
  96.         ///   
  97.         /// 提交事务处理。  
  98.         ///   
  99.         public void Commit()  
  100.         {  
  101.             _begin = false;  
  102.             _transaction.Commit();  
  103.             _transaction = null;//事务执行完毕全部清除(事务不是很常用不需要一直保留)  
  104.             _connection.Close();  
  105.         }  
  106.         ///   
  107.         /// 从挂起状态回滚事务。  
  108.         ///   
  109.         public void Rollback()  
  110.         {  
  111.             _begin = false;  
  112.             _transaction.Rollback();  
  113.             _transaction = null;//事务执行完毕全部清除(事务不是很常用不需要一直保留)  
  114.             _connection.Close();  
  115.         }  
  116.         ///   
  117.        ///  执行查询,并返回查询所返回的结果集DataSet。  
  118.         ///   
  119.         /// 命令文本  
  120.         /// DataSet  
  121.         public DataSet ExecuteDataSet(string commandtext)  
  122.         {  
  123.             return ExecuteDataSet(CommandType.Text, commandtext, null);  
  124.         }  
  125.         ///   
  126.         /// 执行查询,并返回查询所返回的结果集DataSet。  
  127.         ///   
  128.         /// 指定如何解释命令字符串  
  129.         /// 命令文本  
  130.         /// IDbDataParameter参数列表  
  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.         /// 对连接执行 Transact-SQL 语句并返回受影响的行数。  
  144.         ///   
  145.         /// 命令文本  
  146.         /// 受影响的行数  
  147.         public int ExecuteNonQuery(string cmdText)  
  148.         {  
  149.             return ExecuteNonQuery(CommandType.Text, cmdText, null);  
  150.         }  
  151.         ///   
  152.         /// 对连接执行 Transact-SQL 语句并返回受影响的行数。  
  153.         ///   
  154.         /// IDbConnection对象  
  155.         /// 指定如何解析命令字符串  
  156.         /// 命令文本  
  157.         /// 受影响的行数  
  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参数列表  
  172.         /// 受影响的行数  
  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方法。以事务的方式执行  
  181.         ///   
  182.         /// IDbTransaction对象。  
  183.         /// 指定如何解析命令字符串。  
  184.         /// 命令文本。  
  185.         /// IDbDataParameter参数列表。  
  186.         /// 受影响的行数。  
  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 发送到  
  195.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。  
  196.         ///   
  197.         /// 执行的命令文本  
  198.        /// IDataReader对象  
  199.         public IDataReader ExecuteReader(string cmdText)  
  200.         {  
  201.             return ExecuteReader(CommandType.Text, cmdText, null);  
  202.         }  
  203.         ///   
  204.         /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到  
  205.         /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。  
  206.         ///   
  207.         /// 指定如何解析命令字符串  
  208.         /// 命令文本  
  209.         /// IDataParameter参数列表  
  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.         /// 执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。  
  218.         ///   
  219.         /// 命令文本  
  220.         /// 结果集中***行的***列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)  
  221.         public object ExecuteScalar(string cmdText)  
  222.         {  
  223.             return ExecuteScalar(CommandType.Text, cmdText, null);  
  224.         }  
  225.         ///   
  226.         ///  执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。  
  227.         ///   
  228.         /// 指定如何解析命令字符串  
  229.         /// 命令文本  
  230.         /// IDataParameter参数列表  
  231.         /// 结果集中***行的***列;如果结果集为空,则为空引用(在 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.         /// 执行查询,并返回查询所返回的结果集DataTable。  
  239.         ///   
  240.         /// 命令文本  
  241.         /// DataTable  
  242.         public DataTable ExecuteTable(string cmdText)  
  243.         {  
  244.             return ExecuteTable(CommandType.Text, cmdText, null);  
  245.         }  
  246.         ///   
  247.         ///执行查询,并返回查询所返回的结果集DataTable。  
  248.         ///   
  249.         /// 指定如何解析命令字符串  
  250.         /// 命令文本  
  251.         /// IDataParameter参数列表  
  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策略模式
    URL链接:http://www.mswzjz.cn/qtweb/news28/383528.html

    攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能