代理模式

“代理”两字经常听到,在公司里有代理服务器,在我的理解里代理就是个中转站,但是在用户的体验里跟不用代理是一样的。代理模式是为一个对象提供代理对象,代理对象封装了被代理对象的引用。

模式设计的角色:

抽象主题:代理对象和被代理对象公共的接口。

具体主题:被代理对象。

代理对象:模式的核心对象,包含了被代理对象的引用,实施对被代理对象的控制。

结构示意图:

    /// <summary>
    /// 抽象主题角色
    /// </summary>
    public abstract class Subject
    {
        /// <summary>
        /// 模仿登录
        /// </summary>
        abstract public void Login();
    }


    /// <summary>
    /// 具体主题角色
    /// </summary>
    public class ConcreteSubject : Subject
    {
        public override void Login()
        {
            throw new NotImplementedException();
        }
    }

    /// <summary>
    /// 主题代理角色
    /// </summary>
    public class Proxy : Subject
    {
        private ConcreteSubject concreteSubject;

        /// <summary>
        /// 验证
        /// </summary>
        private void Volidate()
        {
        }

        public override void Login()
        {
            Volidate();
            if (concreteSubject == null)
            {
                concreteSubject = new ConcreteSubject();
            }
            concreteSubject.Login();
            Log();
        }

        /// <summary>
        /// 写日志
        /// </summary>
        private void Log()
        {
        }
    }

上面简单的用代码实现了代理模式,被代理对象和代理对象都要从公共的抽象类继承,代理对象并不是要改变被代理对象的接口,否则就跟适配器模式混为一谈了,而是加强。在客户端看来,两者在使用起来并没什么区别。

符合的设计原则:开闭原则、接口单一原则。当要加强一个类的作用时,并不是不加限制的去增加方法,这样显得很冗余,也不符合面向对象设计方法。而是要责任分开,使用代理对象去实现,这样可以不用去修改原来的类而达到目的。

posted on 2012-08-23 00:15  Gates.Li  阅读(216)  评论(0编辑  收藏  举报

导航