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

    一、定义

    定义:为其他对象提供一种代理以控制对这个对象的访问

    在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

    二、结构

    代理模式一般会有三个角色:

      抽象角色(Subject):指代理角色和真实角色对外提供的公共方法,一般为一个接口

      真实角色(RealSubject):需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。

      代理角色(Proxy):需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

    三、实现

    1.静态代理

    namespace DesignPatterns.Proxy
    {
        class Program
        {
            static void Main(string[] args)
            {
                RealStar star = new RealStar();
                Agent agent = new Agent(star);
                agent.DiscussCooperation();
                agent.SignContract();
                agent.PlayRoleInMovie();
                agent.CollectMoney();
            }
        }
    
        public interface IMovieStar
        {
            /// <summary>
            /// 找电影合作
            /// </summary>
            void DiscussCooperation();
            /// <summary>
            /// 签合同
            /// </summary>
            void SignContract();
            /// <summary>
            /// 出演电影角色
            /// </summary>
            void PlayRoleInMovie();
            /// <summary>
            /// 收演出费
            /// </summary>
            void CollectMoney();
        }
         
        public class RealStar : IMovieStar
        { 
            public void DiscussCooperation()
            {
                Console.WriteLine("星爷找电影合作");
            }
             
            public void SignContract()
            {
    
                Console.WriteLine("星爷签合同");
            } 
    
            public void PlayRoleInMovie()
            {
    
                Console.WriteLine("星爷演出");
            }
             
            public void CollectMoney()
            {
    
                Console.WriteLine("星爷收费");
            }
        }
    
    
        public class Agent : IMovieStar
        {
            private IMovieStar _star;
            public Agent(IMovieStar star)
            {
                _star = star;
            }
             
            public void DiscussCooperation()
            {
                Console.WriteLine("经纪人找电影合作");
            }
             
            public void SignContract()
            {
    
                Console.WriteLine("经纪人签合同");
            }
             
            public void PlayRoleInMovie()
            {
                 _star.PlayRoleInMovie();
            }
             
            public void CollectMoney()
            { 
                Console.WriteLine("经纪人收费");
            }
        }
    
    }

    四、使用场景

       按职责来划分,通常有以下使用场景:

       1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

    五、优缺点

      优点:

      1、代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;

      2、代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了保护目标对象的作用。

      缺点: 

      1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

      2、增加了代码维护的复杂度,实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

     

     

    欢迎阅读本系列文章:Head First设计模式之目录

  • 相关阅读:
    我理解的朴素贝叶斯模型
    P2P贷款全攻略,贷前、贷中、贷后工作事项解析
    Jupyter Notebook 快速入门
    R语言|数据特征分析
    R语言︱处理缺失数据&&异常值检验、离群点分析、异常值处理
    mysql explain执行计划详解
    R语言中的回归诊断-- car包
    一行代码搞定 R 语言模型输出!(使用 stargazer 包)
    基于R语言的时间序列指数模型
    基于R语言的ARIMA模型
  • 原文地址:https://www.cnblogs.com/xcsn/p/7277048.html
Copyright © 2011-2022 走看看