C# 设计模式之结构型 —— 代理模式

代理模式(Proxy):

给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

通俗的来讲代理模式就是我们生活中常见的中介。

VPN 翻墙软件 黄牛 代售点

调用

    {
        Console.WriteLine("**************************************");
        Console.WriteLine("This is 结构型设计模式-代理模式Proxy");
        ProxyProgram.Show();
    }

业务接口

    /// <summary>
    /// 业务接口
    /// </summary>
    public interface ISubject
    {
        /// <summary>
        /// get
        /// </summary>
        /// <returns></returns>
        bool GetSomething();

        /// <summary>
        /// do
        /// </summary>
        void DoSomething();
    }
public class ProxyProgram
{
    public static void Show()
    {
        {
            Console.WriteLine("************原生模式1************");
            ISubject subject = new RealSubject();
            subject.DoSomething();
            subject.GetSomething();
        }
        {
            Console.WriteLine("************原生模式2************");
            ISubject subject = new RealSubject();
            subject.DoSomething();
            subject.GetSomething();
        }

        {
            Console.WriteLine("*************代理模式1***********");
            ISubject subject = new ProxySubject();
            subject.DoSomething();
            subject.GetSomething();
            //毫无意义??
        }
        {
            Console.WriteLine("*************代理模式2***********");
            ISubject subject = new ProxySubject();
            subject.DoSomething();
            subject.GetSomething();
            //毫无意义??
        }
        {
            //why
        }
    }
}
    /// <summary>
    /// 代理
    /// 
    /// 日志/异常/单例/缓存/安全/延迟/权限/事务/远程
    /// 
    /// 要求动作加个日志
    /// 有了代理之后,可以通过代理来扩展功能,避免对RealSubject的修改
    /// 
    /// 单例代理:特简单,加个static
    /// 缓存代理:加个缓存,结果存一下,重用一下
    /// 
    /// 
    /// 跟AOP面向切面编程很像?对了!主流AOP实现,靠的就是代理模式(动态代理)
    /// </summary>
    public class ProxySubject : ISubject//不一定非得实现同一个接口
    {
        private static ISubject _iSubject = new RealSubject(); // 单例代理:特简单,加个static

        public void DoSomething()
        {
            try
            {
                Console.WriteLine("Prepare");
                _iSubject.DoSomething();
                Console.WriteLine("After");
            }
            catch (Exception ex)
            {

                throw;
            }
        }

        private static Dictionary<string, bool> ProxySubject_Dictionary = new Dictionary<string, bool>();

        public bool GetSomething()
        {
            string key = $"{nameof(ProxySubject)}.{nameof(GetSomething)}parameter";
            // 缓存代理:加个缓存,结果存一下,重用一下
            if (ProxySubject_Dictionary.ContainsKey(key))
            {
                return ProxySubject_Dictionary[key];
            }
            else
            {
                bool bResult = _iSubject.GetSomething();
                ProxySubject_Dictionary.Add(key, bResult);
                return bResult;
            }
            //return _iSubject.GetSomething();
        }
    }
    //代理模式和适配有啥区别
    /// <summary>
    /// 一个耗时耗资源的对象方法
    /// 一个第三方封装的类和方法
    /// 
    /// 关注的是业务逻辑--要添加其他逻辑,最好不要折腾我
    /// </summary>
    public class RealSubject : ISubject
    {
        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()
        {
            //Console.WriteLine("Prepare");//这得修改Real

            Console.WriteLine("坐车去火车站看看余票信息。。。");
            Thread.Sleep(3000);
            Console.WriteLine("到火车站,看到是有票的");

            //Console.WriteLine("After");
            return true;
        }

        /// <summary>
        /// 火车站买票
        /// </summary>
        public void DoSomething()
        {
            Console.WriteLine("开始排队。。。");
            Thread.Sleep(2000);
            Console.WriteLine("终于买到票了。。。");
        }
    }

总结一下

核心套路:包一层!

代理模式只能添加通用逻辑,不能增加业务逻辑

应用场景:  调用WebService/WCF服务---O/RM

区别

因为核心套路是一样的,都是包一层,都是利用组合;

设计模式是解决问题的具体套路,不同的设计模式是解决不同问题的;

适配器解决对象适配的问题--------------可能增加减少;

代理模式解决的是对象的调用问题-----是不允许参与业务;

其实多个结构型设计模式本质是一样的(包一层),只不过招数略有不同,在 不同的场景下,给起了个不同的名字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值