你可以看到这和其他设计模式的大文章。
{A1}允许您通过创建一个包装类作为代理提供的其他对象的接口。这是代理,包装类,可以添加额外的功能感兴趣的对象,在不改变对象的代码。
下面是其中{A2}是使用的一些常见的例子:添加现有对象的安全访问。代理将确定,如果客户端可以访问感兴趣的对象。简化复杂的对象的API。代理可以提供一个简单的API,使客户端代码没有处理感兴趣的对象的复杂性。提供远程资源,如Web服务或REST资源的接口。协调对远程资源的昂贵的操作要求远程资源,尽快启动之前访问的资源操作。向现有类添加一个线程安全的特点,在不改变现有的类的代码。
总之,代理是正在调用的对象由客户端来访问幕后的真正对象。
让我们来看看{A5} {A7}第一,然后我们将看看一个例子来看看它是如何工作的。下面是{A5} {A}:
{A4}ISubject接口的接口的代理类的RealSubject类实现。它的操作方法。代理类的RealSubject类的代理。它具有realSubject变量指向幕后的真正对象。
它的操作方法封装了真实对象的操作方法。这是的地方,您可以添加额外的逻辑,真正的对象的方法。RealSubject类是幕后的真正对象。它已执行实际工作的操作方法。
让我们看一个例子。在我们的例子中,我们的家庭成员和汽车,这些都是我们不能改变现有的类。我们要进一步明确,只有年满16岁的家庭成员,是可以驱动汽车,我们将代理类添加到这个逻辑。下面是{A5}我们的例子:
{A6}ICAR接口是接口ProxyCar类和汽车接口实现。MoveCar方法。ProxyCar类是为汽车类的代理。它具有realCar变量指向幕后的真正对象。它具有MoveCar方法,它封装了真实对象的MoveCar方法。这是我们提出的额外的逻辑,以确定是否该驱动程序是年满16岁的地方。如果驱动程序不超过16岁,它不会调用实际对象的MoveCar方法。Car类是幕后的真正对象。
下面是实现代码} {A7的输出,使用我们的例子。请注意,代理(ProxyCar)提供了一个网关真正的对象(车),并提供额外的功能,在不改变真正对象的代码:class Program
{
static void Main(string[] args)
{
ICar car = new ProxyCar(new Driver(16));
car.MoveCar();
car = new ProxyCar(new Driver(25));
car.MoveCar();
}
}
interface ICar
{
void MoveCar();
}
//the proxy
class ProxyCar : ICar
{
private Driver driver;
private ICar realCar;
public ProxyCar(Driver driver)
{
this.driver = driver;
realCar = new Car();
}
void ICar.MoveCar()
{
if (driver.Age <= 16)
Console.WriteLine("Sorry the driver is too young to drive");
else
realCar.MoveCar();
}
}
//the real object
class Car : ICar
{
void ICar.MoveCar()
{
Console.WriteLine("Car has been driven");
}
}
class Driver
{
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public Driver(int age)
{
this.age = age;
}
}
{A8}
喜欢这篇文章吗?你可以看到这和其他设计模式{A9}的大文章。