代理模式

31 阅读1分钟

示例

public interface ISubject
    {
        /// <summary>
        /// get   查询是否有票
        /// </summary>
        /// <returns></returns>
        bool GetSomething();

        /// <summary>
        /// do   购买车票
        /// </summary>
        void DoSomething();
    }

实现类

public class RealSubject : ISubject
    {
        /// <summary>
        /// 模拟火车票代售点
        /// </summary>
        public RealSubject()
        {
        	//等待表示很耗费资源
            Thread.Sleep(2000);
            long lResult = 0;
            for (int i = 0; i < 100000000; i++)
            {
                lResult += i;
            }
            Console.WriteLine("RealSubject被构造。。。");
        }

        /// <summary>
        /// 火车站查询火车票
        /// </summary>
        public bool GetSomething()
        {
            return true;// 表示还有车票
        }

        /// <summary>
        /// 火车站买票
        /// </summary>
        public void DoSomething()
        {
            Console.WriteLine("买票");
        }
    }

上端调用

代理的实现类

public class ProxySubject : ISubject
    { 
        private RealSubject realSubject = new RealSubject();

        public void DoSomething()
        {
            realSubject.DoSomething();
        }

        public bool GetSomething()
        {
            return realSubject.GetSomething();
        }
    }

有了这个代理---增加一些公共的逻辑:日志代理、异常捕捉代理、缓存代理

标准的代理:

1、不能修改原有的逻辑。只能增加通用逻辑,不能增加业务逻辑。

2、只能增加公共的逻辑---写日志,异常捕捉,缓存,单例,安全(鉴权授权),延迟,事务,远程(调用远程的东西);

跟AOP代理实现很像,主流AOP靠的就是动态代理

单例代理--构造一次,采用静态字段即可

public class ProxySubject : ISubject
    { 
        private static RealSubject realSubject = new RealSubject();

        public void DoSomething()
        {
            realSubject.DoSomething();
        }

        public bool GetSomething()
        {
            return realSubject.GetSomething();
        }
    }

缓存代理

代理模式、适配器模式区别

7个结构型设计模式很像,都是包一层,区别在于解决什么问题