• 设计模式-代理模式


    定义:

    代理模式模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。代理类与被代理类都实现相同接口

    装饰器模式与代理模式的区别:

    两者都对类进行扩展,只是作用不同。

    它们相同点是:代理类、被代理类继承一个接口,装饰类与被装饰类也继承一个接口

    代理模式强调让别人帮你做和业务无关的工作(记录日志、缓存)。代理模式为了实现对对象的控制,因为被代理类往往不希望直接获得

    装饰器模式强调增强自身,扩展业务,装饰模式是对客户以透明的方式扩展对象功能,是继承方案的一个替代方案

    静态代理:

    每一个被代理类都创建一个代理类,用来增加业务无关的功能,缺点是代码量大,代理模式实现了AOP思想

    动态代理:

    不需要针对每个被代理类都增加一个代理类,可以借助一些组件实现

    案例1:代理Connection、Command对象,为增删改操作添加事件

    Connection

    public sealed class SqlConnectionWrapper : IDbConnection
        {
            private Action<IDbCommand> trace = null;
            private IDbConnection connection = null;
            public SqlConnectionWrapper(IDbConnection connection, Action<IDbCommand> trace=null)
            {
                this.connection = connection;
                this.trace = trace;
            }
    
            public event Action<IDbCommand> Trace
            {
                add { trace += value; }
                remove { trace -= value; }
            }
    
            public string ConnectionString { get => connection.ConnectionString; set => connection.ConnectionString = value; }
    
            public int ConnectionTimeout => connection.ConnectionTimeout;
    
            public string Database => connection.Database;
    
            public ConnectionState State => connection.State;
    
            public IDbTransaction BeginTransaction()
            {
                return connection.BeginTransaction();
            }
    
            public IDbTransaction BeginTransaction(IsolationLevel il)
            {
                return connection.BeginTransaction(il);
            }
    
            public void ChangeDatabase(string databaseName)
            {
                connection.ChangeDatabase(databaseName);
            }
    
            public void Close()
            {
                connection.Close();
            }
    
            public IDbCommand CreateCommand()
            {
                var cmd = connection.CreateCommand();
                return new SqlCommandWrapper(cmd, this.trace);
            }
    
            public void Dispose()
            {
                connection.Dispose();
            }
    
            public void Open()
            {
                connection.Open();
            }
    
            public override string ToString()
            {
                return this.connection.ConnectionString;
            }
        }
    View Code

    Command

    public sealed class SqlCommandWrapper : IDbCommand
        {
            private Action<IDbCommand> trace = null;
            private IDbCommand command = null;
            public SqlCommandWrapper(IDbCommand command, Action<IDbCommand> trace = null)
            {
                this.command = command;
                this.trace = trace;
            }
    
    
    
            public string CommandText { get => command.CommandText; set => command.CommandText = value; }
            public int CommandTimeout { get => command.CommandTimeout; set => command.CommandTimeout = value; }
            public CommandType CommandType { get => command.CommandType; set => command.CommandType = value; }
            public IDbConnection Connection { get => command.Connection; set => command.Connection = value; }
    
            public IDataParameterCollection Parameters { get => command.Parameters; }
    
            public IDbTransaction Transaction { get => command.Transaction; set => command.Transaction = value; }
            public UpdateRowSource UpdatedRowSource { get => command.UpdatedRowSource; set => command.UpdatedRowSource = value; }
    
            public void Cancel()
            {
                command.Cancel();
            }
    
            public IDbDataParameter CreateParameter()
            {
                return command.CreateParameter();
            }
    
            public void Dispose()
            {
                command.Dispose();
            }
    
            public int ExecuteNonQuery()
            {
                trace?.Invoke(this);
                return command.ExecuteNonQuery();
            }
    
            public IDataReader ExecuteReader()
            {
                trace?.Invoke(this);
                return command.ExecuteReader();
            }
    
            public IDataReader ExecuteReader(CommandBehavior behavior)
            {
                trace?.Invoke(this);
                return command.ExecuteReader(behavior);
            }
    
            public object ExecuteScalar()
            {
                trace?.Invoke(this);
                return command.ExecuteScalar();
            }
            public void Prepare()
            {
                command.Prepare();
            }
        }
    View Code

    未完待续...

  • 相关阅读:
    Passion回来了
    VS.NET Addin在Design time获取控件值
    [过时的消息]VS2005 Shipped!
    为asp.net程序添加自定义配置区域
    Visual Studio .NET 2002 Service Pack 1 出来了
    Winform下通过控件名称来获取控件
    new blog, new life
    我的hotmail信箱容量变成2G了!
    first day in microsoft
    在client端通过java script调用Web Service
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12262725.html
Copyright © 2020-2023  润新知