用Unity写设计模式-代理模式

代理模式介绍

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

  • Proxy 代理 (MathProxy)

维护一个引用,让代理访问真正的主题。 如果RealSubject和Subject接口相同,则代理可以引用Subject。

提供了一个与Subject相同的接口,因此可以用代理代替真正的Subject。 控制对真实主题的访问,并可能负责创建和删除它。

其他责任取决于代理的类型: 远程代理负责编码请求及其参数,并将编码后的请求发送到另一个地址空间的实际主体。

“虚拟代理”可能会缓存关于真实主题的额外信息,以便他们可以推迟访问它。

例如,来自Motivation的ImageProxy缓存真实图像的范围。 “保护代理”检查调用者是否具有执行请求所需的访问权限。

  • Subject 科目 (IMath)

定义了RealSubject和Proxy的公共接口,以便代理可以在任何需要RealSubject的地方使用。

  • RealSubject 具体科目 (Math)

定义代理所代表的实际对象。

代理模式

//-------------------------------------------------------------------------------------
//	ProxyStructure.cs
//-------------------------------------------------------------------------------------

using UnityEngine;
using System.Collections;

namespace ProxyStructure
{

    public class ProxyStructure : MonoBehaviour
    {
	    void Start ( )
        {
            // Create proxy and request a service
            Proxy proxy = new Proxy();
            proxy.Request();
        }
    }

    /// <summary>
    /// The 'Subject' abstract class
    /// </summary>
    abstract class Subject
    {
        public abstract void Request();
    }

    /// <summary>
    /// The 'RealSubject' class
    /// </summary>
    class RealSubject : Subject
    {
        public override void Request()
        {
            Debug.Log("Called RealSubject.Request()");
        }
    }

    /// <summary>
    /// The 'Proxy' class
    /// </summary>
    class Proxy : Subject
    {
        private RealSubject _realSubject;

        public override void Request()
        {
            // Use 'lazy initialization'
            if (_realSubject == null)
            {
                _realSubject = new RealSubject();
            }

            _realSubject.Request();
        }
    }
}

代理模式案例1

//-------------------------------------------------------------------------------------
//	ProxyPatternExample1.cs
//-------------------------------------------------------------------------------------

using UnityEngine;
using System.Collections;

//This real-world code demonstrates the Proxy pattern for a Math object represented by a MathProxy object.
namespace ProxyPatternExample1
{
    public class ProxyPatternExample1 : MonoBehaviour
    {
        void Start()
        {
            // Create math proxy
            MathProxy proxy = new MathProxy();

            // Do the math
            Debug.Log("4 + 2 = " + proxy.Add(4, 2));
            Debug.Log("4 - 2 = " + proxy.Sub(4, 2));
            Debug.Log("4 * 2 = " + proxy.Mul(4, 2));
            Debug.Log("4 / 2 = " + proxy.Div(4, 2));
        }
    }

    /// <summary>
    /// The 'Subject interface
    /// </summary>
    public 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>
    /// The 'RealSubject' class
    /// </summary>
    class Math : IMath
    {
        public double Add(double x, double y) { return x + y; }
        public double Sub(double x, double y) { return x - y; }
        public double Mul(double x, double y) { return x * y; }
        public double Div(double x, double y) { return x / y; }
    }

    /// <summary>
    /// The 'Proxy Object' class
    /// </summary>
    class MathProxy : IMath
    {
        private Math _math = new Math();

        public double Add(double x, double y)
        {
            return _math.Add(x, y);
        }
        public double Sub(double x, double y)
        {
            return _math.Sub(x, y);
        }
        public double Mul(double x, double y)
        {
            return _math.Mul(x, y);
        }
        public double Div(double x, double y)
        {
            return _math.Div(x, y);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值