至少在以下集中情况下可以用 Proxy模式解决问题:
1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理
去完成,GoF 称之为虚代理(Virtual Proxy);
2)为网络上的对象创建一个局部的本 比如要操作一个网络上的一个对象(网
络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称
之为远程代理(Remote Proxy);
3)对对象进行控制访问的时候,比如在 Jive 论坛中不同权限的用户(如管理员、普通
用户等)将获得不同层次的操作权限,我们将这个工作交给一个代理去完成,GoF 称之为保
护代理(Protection Proxy)。
4)智能指针(Smart Pointer),关于这个方面的内容,建议参看 Andrew Koenig 的《C++沉思录》中的第 5 章。
This real-world code demonstrates the Proxy pattern for a Math object represented by a MathProxy object.
// Proxy pattern -- Real World example
|
using System;
namespace DoFactory.GangOfFour.Proxy.RealWorld { // Mainapp test application
class MainApp { static void
Main
() { // Create math proxy MathProxy p = new MathProxy();
// Do the math Console.WriteLine("4 + 2 = " + p.Add(4, 2)); Console.WriteLine("4 - 2 = " + p.Sub(4, 2)); Console.WriteLine("4 * 2 = " + p.Mul(4, 2)); Console.WriteLine("4 / 2 = " + p.Div(4, 2));
// Wait for user Console.Read(); } }
// "Subject"
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); }
// "RealSubject"
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;} }
// "Proxy Object"
class MathProxy : IMath { Math math;
public MathProxy() { 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); } } }
|
Output
4 + 2 = 6 4 - 2 = 2 4 * 2 = 8 4 / 2 = 2
|