WEB开发网
开发学院软件开发C语言 C# Design Patterns (4) - Proxy 阅读

C# Design Patterns (4) - Proxy

 2009-07-06 07:07:20 来源:WEB开发网   
核心提示: 图 4示例 03_DbProxy / Default.aspx.cs 的类图03_DbProxy / Default.aspx.csusingSystem;usingcom.cnblogs.WizardWu.Sample03;usingSystem.Data;usingSystem.Dat

图 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 却可以动态地添加。

上一页  1 2 3 4 5 6 

Tags:Design Patterns Proxy

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接