C# Design Patterns (4) - Proxy
2009-07-06 07:07:20 来源:WEB开发网图 4 示例 03_DbProxy / Default.aspx.cs 的类图
03_DbProxy / Default.aspx.cs
using System;
using com.cnblogs.WizardWu.Sample03;
using System.Data;
using System.Data.Common;
using System.Configuration;
//客戶端程序
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
IDbCommand command = new DbCommandProxy();
command.CommandText = "SELECT COUNT(*) FROM Employees";
//显示 Employees 表的记录总数
this.Label1.Text = command.ExecuteScalar().ToString();
}
}
//服務器端程序
namespace com.cnblogs.WizardWu.Sample03
{
//这个类并非「被代理者」。此为自定义 DbCommandProxy 类的辅助类。
//将具体建立数据库连接…等,较复杂的部分提取出来,隔离在这个类里去处理
class DbContext
{
private string strProviderName;
private string strConnectionString;
public DbContext(string name) //构造函数
{
//取得 Web.config 里的数据库连接字符串名称
ConnectionStringSettings setting = ConfigurationManager.ConnectionStrings["ConnString_SqlClient"];
this.strProviderName = setting.ProviderName;
this.strConnectionString = setting.ConnectionString;
}
public DbConnection CreateConnection()
{
DbProviderFactory factory = DbProviderFactories.GetFactory(this.strProviderName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = this.strConnectionString;
return connection;
}
}
//将「代理者、被代理者」合而为一 (另一种做法)。
//此类同时为 RealSubject 和 Proxy 的类
public class DbCommandProxy : IDbCommand
{
private DbContext context;
private string strCommandText;
public DbCommandProxy(string name) //构造函数
{
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
this.context = new DbContext(name);
}
public DbCommandProxy() : this("default") { } //构造函数
public object ExecuteScalar()
{
using (DbConnection connection = context.CreateConnection())
{
connection.Open();
DbCommand command = connection.CreateCommand();
command.CommandText = this.strCommandText;
command.CommandType = CommandType.Text;
return command.ExecuteScalar();
}
}
public string CommandText
{
get { return this.strCommandText; }
set { this.strCommandText = value; }
}
//IDbCommand 接口未被实现的成员
}
} // end of namespace
Proxy Pattern 适用的情景:
对象创建的代价比较高。
仅在操作被请求时创建对象。
对象需要访问控制,如: 权限验证,或访问的同时去执行检查或簿记工作。
需要访问远程站点。
被访问时,需要执行一些逻辑判断的动作。
Proxy Pattern 的优点:
降低对象使用的复杂度。
增加对象使用的友好度。
提高程序的效率和性能 (如同 HTTP 的 Proxy Server)。
Proxy Pattern 的缺点:
和一些 Pattern 一样,Proxy Pattern 会造成系统设计中,类的数量增加。
Proxy Pattern 的其他特性:
Proxy Pattern 的结构,类似上一篇帖子的 Decorator Pattern (装饰模式),但是目的不同。
Decorator Pattern 替对象加上行为,而 Proxy Pattern 则是控制对象的访问。
Proxy Pattern 的关系是在设计阶段就确定好了的,是事先知道的;而 Decorator Pattern 却可以动态地添加。
更多精彩
赞助商链接