策略模式在我们日常开发中经常被用到,这篇文章不是策略模式的深入讨论和学术研究,只是让初学者能有个基本的了解。
什么叫策略:1. 可以实现目标的方案集合;2. 根据形势发展而制定的行动方针和斗争方法;3. 有斗争艺术,能注意方式方法。
什么叫模式:模式(Pattern)其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的***办法。
什么叫策略模式:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
从上面的官方解释来看,我们已经有了一个基本的雏形。其实设计模式就是前辈们所总结出来的,用来解决某类问题的方法论;这些方法论是经过身经百战的专家们提炼出来的,比较规范的、比较科学的模型。
其实设计模式对初学者来说可能有点头疼,比较抽象。大概就是因为初学者对一些概念不能深度的理解,一些理论知识还没能够融会贯通,不过不要紧经过一段时间的实践锻炼就能理解了;下面我们循环渐进的来讲解什么叫策略模式。我们拿真实项目中遇到的问题来讲解吧,这样能更好的吸引注意力。
情景引入:
您是否遇到过这样一个头疼的问题,在我们开发信息系统的时候,经常需要切换不同的数据库。但是由于我们前期开发项目的时候没有考虑到后期的变更,所以这个时候问题就来了。如果需要更换数据库,将大动干戈把代码翻个底朝天。将诸如一些Sql、Oledb、Oracle之类的对象进行全局替换。这样的设计永远都无法满足日后的数据库变更需求。所以在前期设计的时候,我们就需要考虑到系统后期可能存在哪些可能变化的地方,在系统的架构上就需要变通设计(比如:依赖接口而不是具体的对象,通过依赖注入等方式进行策略的变更;)。其实这个时候我们很需要一种模式能解决此类问题,恰好前辈们为我们准备好了(策略模式)。[设计模式的设计原则:尽可能的考虑系统后期的变化;]
1.没有分析之前的系统结构:
情景分析:
我们暂且不谈设计模式,我们试着自己分析一下问题。我们需要一种机制,能在需要的时候自动变更后台数据源的连接对象;我们来收集问题,既然要自动变更后台数据源连接对象,那么我们在编码的过程中就不能直接使用一些诸如SqlConnection、SqlCommand等对象,必须进行提取形成接口,消除类之间的强耦合。[面向对象编程原则:面向接口编程,而不是面向实现编程;]
2.分析之后的系统结构图:
情景分析->接口提取:
- /*----------------------------------------------------------------
- * 作者:王清培
- * 时间:2010-10-29
- * ----------------------------------------------------------------*/
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Data;
- using System.Data.SqlClient;
- namespace W.Data
- {
- ///
- /// 通用数据源类型接口,
- /// 确定每种数据源必须实现基本的对IDbConnection,IDbCommand,IDbTransaction 三者的包装;
- ///
- public interface IDataSourceType
- {
- #region 属性
- ///
- /// 获取或设置数据源连接字符串。
- ///
- string ConnectionString { get; set; }
- #endregion
- ///
- /// 开始数据库事务。
- ///
- void BeginTransaction();
- ///
- /// 提交事务处理。
- ///
- void Commit();
- ///
- /// 从挂起状态回滚事务。
- ///
- void Rollback();
- ///
- /// 执行查询,并返回查询所返回的结果集DataSet。
- ///
- /// 要执行的命令文本
- ///
DataSet - DataSet ExecuteDataSet(string commandtext);
- ///
- /// 执行查询,并返回查询所返回的结果集DataSet。
- ///
- /// 指定如何解释命令字符串。
- /// 命令文本
- /// IDbDataParameter参数列表
- ///
DataSet - DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
- ///
- /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
- ///
- /// 命令文本
- ///
受影响的行数 - int ExecuteNonQuery(string cmdText);
- ///
- /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDbDataParameter参数列表
- ///
受影响的行数 - int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter);
- ///
- /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
- ///
- /// IDbConnection对象
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDbDataParameter参数列表
- ///
受影响的行数 - int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- ///对连接执行 Transact-SQL 语句并返回受影响的行数。已事务的方式执行
- ///
- /// IDbTransaction对象。
- /// 指定如何解析命令字符串。
- /// 命令文本。
- /// IDbDataParameter参数列表。
- ///
受影响的行数。 - int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。
- ///
- /// 执行的命令文本
- ///
IDataReader对象 - IDataReader ExecuteReader(string cmdText);
- ///
- /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter参数列表
- ///
IDataReader对象 - IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。
- ///
- /// 命令文本
- ///
结果集中***行的***列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing) - object ExecuteScalar(string cmdText);
- ///
- /// 执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter参数列表
- ///
结果集中***行的***列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)。 - object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 执行查询,并返回查询所返回的结果集DataTable。
- ///
- /// 命令文本
- ///
DataTable - DataTable ExecuteTable(string cmdText);
- ///
- ///执行查询,并返回查询所返回的结果集DataTable。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter参数列表
- ///
DataTable - DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter);
- ///
- /// 关闭数据库连接。
- ///
- void Close();
- ///
- /// 执行与释放或重置非托管资源相关的应用程序定义的任务。
- ///
- void Dispose();
- }
- }
情景分析->OLEDB数据源实现:
- /*----------------------------------------------------------------
- * 作者:王清培
- * 时间:2010-10-29
- * ----------------------------------------------------------------*/
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Configuration;
- using System.Data.OleDb;
- using System.Data;
- namespace W.Data
- {
- ///
- /// OLEDB数据源
- ///
- public sealed class OledbSource : IDataSourceType, IDisposable
- {
- #region 字段
- ///
- /// 是否已开始数据库事务处理
- ///
- private bool _begin = false;
- ///
- /// IDbConnection对象(包装的SqlConnection对象)
- ///
- private OleDbConnection _connection;
- ///
- /// IDbTransaction对象(包装的SqlTransaction对象)
- ///
- private OleDbTransaction _transaction;
- ///
- /// 静态全局(SQLServerSource数据源)实例连接字符串对象;
- ///
- private static string _globalconnectionstring = string.Empty;
- #endregion
- #region 属性
- ///
- /// 获取,静态全局SQLServerSource数据源实例连接字符串对象;
- ///
- public static string GlobalConnectionString
- {
- get { return _globalconnectionstring; }
- }
- ///
- /// 获取或设置本次执行的数据源的连接字符串
- ///
- public string ConnectionString
- {
- get { return _connection.ConnectionString; }
- set { _connection.ConnectionString = value; }
- }
- ///
- /// 获取包装的SqlTransaction对象
- ///
- public OleDbTransaction SqlTransaction
- {
- get { return _transaction; }
- }
- #endregion
- #region 构造函数
- ///
- /// 静态构造函数。
- ///
- static OledbSource()
- {
- //设置全局(SQLServerSource实例)对象的默认连接字符串
- _globalconnectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
- }
- ///
- ///默认实例构造函数
- ///
- public OledbSource()
- {
- _connection = new OleDbConnection(_globalconnectionstring);
- }
- ///
- /// 重载构造函数,使用指定连接字符串来初始化 CommandLib.Data.SQLServerSource 类的新实例。默认所有的SQLServerSource实例均使用
- /// 配置文件中的SQLServerConnectionString类型的连接字符串。
- ///
- /// 连接字符串
- public OledbSource(string connectionstring)
- {
- _connection = new OleDbConnection(connectionstring);
- }
- #endregion
- #region 实例方法
- ///
- /// 开始数据库事务。
- ///
- public void BeginTransaction()
- {
- _begin = true;
- _connection.Open();
- _transaction = _connection.BeginTransaction();//新建数据源的事务对象
- }
- ///
- /// 提交事务处理。
- ///
- public void Commit()
- {
- _begin = false;
- _transaction.Commit();
- _transaction = null;//事务执行完毕全部清除(事务不是很常用不需要一直保留)
- _connection.Close();
- }
- ///
- /// 从挂起状态回滚事务。
- ///
- public void Rollback()
- {
- _begin = false;
- _transaction.Rollback();
- _transaction = null;//事务执行完毕全部清除(事务不是很常用不需要一直保留)
- _connection.Close();
- }
- ///
- /// 执行查询,并返回查询所返回的结果集DataSet。
- ///
- /// 命令文本
- ///
DataSet - public DataSet ExecuteDataSet(string commandtext)
- {
- return ExecuteDataSet(CommandType.Text, commandtext, null);
- }
- ///
- /// 执行查询,并返回查询所返回的结果集DataSet。
- ///
- /// 指定如何解释命令字符串
- /// 命令文本
- /// IDbDataParameter参数列表
- ///
DataSet - public DataSet ExecuteDataSet(CommandType commandtype, string commandtext, params IDataParameter[] parameter)
- {
- if (_connection.State == ConnectionState.Closed)
- _connection.Open();
- OleDbCommand commmand = InitSqlCommand(commandtype, commandtext, parameter);
- OleDbDataAdapter adapter = new OleDbDataAdapter(commmand);
- DataSet ds = new DataSet();
- adapter.Fill(ds);
- return ds;
- }
- ///
- /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
- ///
- /// 命令文本
- ///
受影响的行数 - public int ExecuteNonQuery(string cmdText)
- {
- return ExecuteNonQuery(CommandType.Text, cmdText, null);
- }
- ///
- /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
- ///
- /// IDbConnection对象
- /// 指定如何解析命令字符串
- /// 命令文本
- ///
受影响的行数 - public int ExecuteNonQuery(CommandType commandtype, string commandtext, params IDataParameter[] parameter)
- {
- if (_connection.State == ConnectionState.Closed)
- _connection.Open();
- OleDbCommand command = InitSqlCommand(commandtype, commandtext, parameter);
- return command.ExecuteNonQuery();
- }
- ///
- /// 重载ExecuteNonQuery方法。
- ///
- /// IDbConnection对象
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDbDataParameter参数列表
- ///
受影响的行数 - public int ExecuteNonQuery(IDbConnection conn, CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- command.Connection = (conn as OleDbConnection);
- return command.ExecuteNonQuery();
- }
- ///
- /// 重载ExecuteNonQuery方法。以事务的方式执行
- ///
- /// IDbTransaction对象。
- /// 指定如何解析命令字符串。
- /// 命令文本。
- /// IDbDataParameter参数列表。
- ///
受影响的行数。 - public int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- command.Transaction = (trans as OleDbTransaction);
- return command.ExecuteNonQuery();
- }
- ///
- /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。
- ///
- /// 执行的命令文本
- ///
IDataReader对象 - public IDataReader ExecuteReader(string cmdText)
- {
- return ExecuteReader(CommandType.Text, cmdText, null);
- }
- ///
- /// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到
- /// System.Data.SqlClient.SqlCommand.Connection 并生成一个 System.Data.SqlClient.SqlDataReader。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter参数列表
- ///
IDataReader对象 - public IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- return command.ExecuteReader();
- }
- ///
- /// 执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。
- ///
- /// 命令文本
- ///
结果集中***行的***列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing) - public object ExecuteScalar(string cmdText)
- {
- return ExecuteScalar(CommandType.Text, cmdText, null);
- }
- ///
- /// 执行查询,并返回查询所返回的结果集中***行的***列。忽略其他列或行。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter参数列表
- ///
结果集中***行的***列;如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)。 - public object ExecuteScalar(CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- return command.ExecuteScalar();
- }
- ///
- /// 执行查询,并返回查询所返回的结果集DataTable。
- ///
- /// 命令文本
- ///
DataTable - public DataTable ExecuteTable(string cmdText)
- {
- return ExecuteTable(CommandType.Text, cmdText, null);
- }
- ///
- ///执行查询,并返回查询所返回的结果集DataTable。
- ///
- /// 指定如何解析命令字符串
- /// 命令文本
- /// IDataParameter参数列表
- ///
DataTable - public DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDataParameter[] parameter)
- {
- OleDbCommand command = InitSqlCommand(cmdType, cmdText, parameter);
- DataTable resulttb = new DataTable();
分享题目:浅谈.NET策略模式
URL链接:http://www.mswzjz.cn/qtweb/news28/383528.html攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能