设计模式---Proxy Pattern

  • Proxy Pattern
    代理模式(Proxy Pattern) :给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。它是一种对象结构型模式。
  • Proxy角色分析
    代理模式包含三个角色:
  • Subject (抽象主题角色): 声明了真实主题和代理主题的共同接口;
  • Proxy(代理主题角色):内部包含对真实主题的引用,从而可以在任何时候操作真实主题对象;
  • RealSubject(真实主题角色):定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,
  • Client:(客户端)可以通过代理主题角色间接调用真实主题角色中定义的方法。
/*
 * Proxy Pattern
 */
using System;
using System.Collections.Generic;

namespace Pattern03
{

    class Program
    {

        static void Main(string[] args)
        {
            // Create proxy and request a service

            Proxy proxy = new Proxy();
            proxy.Request();

            Console.ReadKey();
        }

    }
    /// <summary>
    /// Subject abstract class
    /// </summary>
    abstract class Subject
    {
        public abstract void Request();
    }
    /// <summary>
    /// RealSubject
    /// </summary>
    class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("called RealSubject.Request()");
        }
    }
    /// <summary>
    /// Proxy
    /// </summary>
    class Proxy : Subject
    {
        private RealSubject _realSubject;
        public override void Request()
        {
            // use lazy initialzation
            if (_realSubject == null)
            {
                _realSubject = new RealSubject();
            }
            _realSubject.Request();
        }
    }
}

  • 类图
    在这里插入图片描述

  • 使用场景

  • 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中。

  • 虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。例如:imageProxy

  • 保护(Protect or Access)代理:检查调用者是否有访问权限,控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

  • 缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

-代码示例2

/*
 * Proxy Pattern
 */
using System;
using System.Collections.Generic;

namespace Pattern03
{

    class Program
    {

        static void Main(string[] args)
        {
            // Create proxy and request a service
            MathProxy mathProxy = new MathProxy();
            Console.WriteLine("3+4 add: "+ mathProxy.Add(3,4));
            Console.WriteLine("3-4 Sub: " +mathProxy.Sub(3,4));
            Console.WriteLine("3*4 Mul: " + mathProxy.Mul(3, 4));
            Console.WriteLine("3/4 Div: " + mathProxy.Div(3, 4));
            
            Console.ReadKey();
        }

    }
    /// <summary>
    /// Subject abstract 
    /// </summary>
    interface  IMath
    {
        double Add(double x, double y);
        double Sub(double x, double y);
        double Mul(double x, double y);
        double Div(double x, double y);
         
    }
    /// <summary>
    /// RealSubject
    /// </summary>
    class Math : IMath
    {
        public double Add(double x, double y)
        {
            return x + y;
        }

        public double Div(double x, double y)
        {
            return x / y;
        }

        public double Mul(double x, double y)
        {
            return x * y;
        }

        public double Sub(double x, double y)
        {
            return x - y;
        }
    }
    /// <summary>
    /// Proxy
    /// </summary>
    class MathProxy : IMath
    {
        private Math  _math= new Math();
        public double Add(double x, double y)
        {
            return _math.Add(x, y);
        }
        public double Div(double x, double y)
        {
            return _math.Div(x, y);
        }
        public double Mul(double x, double y)
        {
            return _math.Mul(x, y);
        }
        public double Sub(double x, double y)
        {
            return _math.Sub(x, y);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值