zoukankan      html  css  js  c++  java
  • 设计模式之代理模式

    先抓一张网上的类图:

    代理模式:就是使用一个代理类,代替了真正的我们要使用的类。

    从图中可以看出 代理类proxy, 真正要使用的的类RealSubject. 它们都是Subject的子类

    使用了代理类的主要目的:

    一. 为了解耦。client使用的是代理类,而不是RealSubject, 业务代码与非业务代码也实现了分离.

    二. 通过代理类,我们对realsubject的业务可以进行封装和扩充,增加额外的业务处理,如,请求过滤,增加日志,权限等。我觉得这才是代理的核心作用

    代理模块的实现,有静态代理和动态代理两种。

    静态代理:如类图所示:一个真实对象,需要创建一个对应的代理对象,这样无疑增加了类的数量,增加了复杂度。

    动态代理:通过反射等技术手段,动态增加代理类。

    先来看下静态代理的代码如下:

        /// <summary>
        /// 酒店服务
        /// </summary>
        public interface IHotelService
        {
            /// <summary>
            /// 客房预订
            /// </summary>
            void Booking();
        }
    
        public class HotelService : IHotelService
        {
            public void Booking()
            {
                // 业务逻辑。。。
            }
        }
    
        /// <summary>
        /// Ctrip携程,第三方
        /// </summary>
        public class CtripService : IHotelService
        {
            private HotelService hotelService;
    
            public CtripService()
            {
                hotelService = new HotelService();
            }
    
            public void Booking()
            {
                // Before 租车 + 早餐 + 保险
    
                hotelService.Booking();
    
                // After 景点门票+其他费用
            }
        }
    
        public class Customer
        {
            public void Travel()
            {
                IHotelService hotelService = new CtripService();
                // 使用代理模式,如使用第三方的服务,势必要加一些其他的“服务”项目。。。。。
                hotelService.Booking();
    
            }
        }

    再来看一下动态代理的代码,

    这里我们直接使用Castle的动态代理:

    /// <summary>
        /// 酒店服务
        /// </summary>
        public interface IHotelService
        {
            /// <summary>
            /// 客房预订
            /// </summary>
            void Booking();
        }
    
        public class HotelService : IHotelService
        {
            //使用Castle动态代理,被代理的方法,需要加virtual
            public virtual void Booking()
            {
                // 业务逻辑。。。
            }
        }
    
    
        public class CtripProcessCastle : IInterceptor
        {
            public void Intercept(IInvocation invocation)
            {
                this.Before();
                invocation.Proceed();
                this.After();
            }
    
            public void Before()
            {
                //租车 + 早餐 + 保险
            }
    
            public void After()
            {
                //景点门票+其他费用
            }
        }
    
    
        public class Customer
        {
            public void Travel()
            {
                ProxyGenerator generator = new ProxyGenerator();
                CtripProcessCastle castle = new CtripProcessCastle();
                IHotelService proxy = generator.CreateClassProxy<HotelService>(castle);
                proxy.Booking();
    
            }
        }

    我们减少那个代理类,增加了一个类用于处理第三方业务逻辑的类(这个类是必不可少的,总要写一下要做什么)

    代理模式的应用:

    1. AOP编程:这一点从asp.net mvc的actionfilter可以明显的看出来

    2. 延迟加载:new代理类的时候什么都不做,booking的时候,再new RealSubject. 意思就是说真正使用这个类的时候才new,避免资源浪费。

  • 相关阅读:
    quota磁盘配额
    lvm管理
    快照
    分区工具
    课下测试03!03!03!题目截图及解析(不完全正确)第四周--信息安全系统设计基础
    2017-2018-1 20155307《信息安全技术李冬冬》实验二——Windows口令破解
    2017-2018-1 20155301 20155307 20155339 《信息安全系统设计基础》 实验一 开发环境的熟悉
    2017-2018-1 20155307 《信息安全系统设计基础》第5周学习总结
    PGP的原理与使用
    2017-2018-1 20155307 《信息安全系统设计基础》第四周学习总结
  • 原文地址:https://www.cnblogs.com/hankuikui/p/6993233.html
Copyright © 2011-2022 走看看