代理模式
using System;namespace Proxy{//水果销售者public abstract class FruitSeller{//抽象卖水果方法public abstract int Sell(ref int money);}//果农public class Orchardist : FruitSeller{//卖水果收入:元int money = 0;int fruit = 100000000;//果农卖水果 :5000元/吨public override int Sell(ref int money){int fruit = money / 5000;//水果卖出的数量int price = fruit * 5000;//卖出水果收入money -= price;//购买者支出的金额this.money +=price ;//果农收入this.fruit -= fruit;//果农卖出的水果Console.WriteLine(\"果农卖出{0}吨水果,还剩{1}吨水果,收入{2}元\",fruit,this.fruit,price);return fruit;}}//水果代理商public class FruitAgent : FruitSeller{int money = 500000;//卖水果收入:元int fruit = 0;//水果总量:千克FruitSeller orchardist;//卖水果:10元/千克public override int Sell(ref int money){if (orchardist==null){orchardist = new Orchardist();}int fruit = money / 10;//卖出水果的数量//如果水果总量不足,则向果农购买水果if (fruit > this.fruit){this.fruit += this.orchardist.Sell(ref this.money) * 1000;}this.fruit -= fruit;//代理商卖出的水果this.money += fruit * 10;//代理商的收入money -= fruit * 10;//购买者支出的金额Console.WriteLine(\"代理商卖出水果{0}千克,还剩{1}千克水果,收入{2}元!\",fruit ,this.fruit,fruit*10);return fruit;//卖出水果的数量}}class Program{static void Main(string[] args){//创建代理商类FruitAgent proxy = new FruitAgent();int money = 1234;int fruit = proxy.Sell(ref money);//代理商向消费者卖水果Console.WriteLine(\"消费者花费{0}元购买{1}千克水果!\", 1234 - money, fruit);Console.ReadKey();}}}
代码解析:
本实例代码实现了代理模式,代码中创建了抽象水果销售者类FruitSeller及其派生类果农类Orchardist和水果代理商类FruitAgent,其中FruitAgent类就是Orchardist类的代理类。在 FruitAgent类中创建了 Orchardist类的实例,消费者通过 FruitAgent类购买水果,FruitAgent类对 Orchardist类的调用批发水果。而且 FruitAgent类中对 Orchardist类的创建还延迟到了对 Orchardist类调用的时候。在 FruitAgent 中还可以在调用 Orchardist类之前添加一些安全认证代码,或是Orchardist类所依赖的一些初始化工作等。这就是代理模式。
说明:
代理模式的主要功能是为一个类提供一个替换的代理类来实现对其进行访问,通过代理类可以降低类的复杂度,还可以提高类访问时的友好度,增加类的访问安全性,以及在调用者无法直接对类进行调用时使用代理类来建立中间层。