代理模式介绍
为其他对象提供一种代理以控制对这个对象的访问。
- 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);
}
}
}