设计模式之代理模式
代理模式,我想大家一听表面的意思能得到一些信息,就是代理工作,为什么会产生这种模式呢?因为它可以使面向对象的复用性和灵活性增强。用一个很形象的例子来说明一下,比如说一张支票或银行汇票是对一个账户上资金的代理,支票能代替现金购买,最终能控制访问开证人账户上的现金,如果我们拿几车现金去购买东西,岂不是很费力,而用一张小小的支票代理就完全搞定了。
下面是代理模式的结构图:
用一个简单的结构图描述就是:
用代码表示这种图如下:
class Program { static void Main(string[] args) { Proxy proxy=new Proxy (); proxy .Request (); Console.Read (); } abstract class Subject { public abstract void Request() } class RealSubject:Subject { Console .Writeline("真实请求"); } class Proxy:Subject { RealSubject realsubject; public override void Request() { if (realsubject==null ) { realsubject=new RealSubject (); } realsubject .Request (); } } }代理在实际中的应用:
一、远程代理:为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador),用一个形象的图表示一下:
二、虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。应用虚拟代理就是先创建一个消耗小的对象来代理,需要的时候再真实创建,比如淘宝中的那些小图片,很容易加载的,如果我们看到的是直接的某件商品,淘宝上无数的商品不知道要加载到何时才能加载完全,而用代理的小图标后,只有我们点击了某个小图标后才会创建真实的商品以及它的详细情况。
三、安全代理:用来控制真实对象访问时的权限。一般用于对象有不同的访问权限时。
四、智能指引:当调用真实对象时,代理处理另外一些事。它取代了指针,在访问对象时附加一些操作,比如第一次引用一个持久对象时,将它装入内存。
最后用书中的一个实例来演示一下:
- //代理接口
- public interface GiveGift
- {
- void giveDolls();
- void giveFlowers();
- void giveChocolate();
- }
- //追求者类
- public class Pursuit implements GiveGift
- {
- SchoolGirl mm;
- public Pursuit(SchoolGirl mm)
- {
- this.mm = mm;
- }
- public void giveDolls()
- {
- System.out.println(mm.name + " 送你洋娃娃");
- }
- public void giveFlowers()
- {
- System.out.println(mm.name + " 送你鲜花");
- }
- public void giveChocolate()
- {
- System.out.println(mm.name + " 送你巧克力");
- }
- }
- //代理类
- public class Proxy implements GiveGift
- {
- Pursuit gg;
- public Proxy(SchoolGirl mm)
- {
- gg = new Pursuit(mm);
- }
- public void giveChocolate()
- {
- gg.giveChocolate();
- }
- public void giveDolls()
- {
- gg.giveDolls();
- }
- public void giveFlowers()
- {
- gg.giveFlowers();
- }
- }
- //客户端代码
- public class Main
- {
- public static void main(String[] args)
- {
- SchoolGirl jiaojiao = new SchoolGirl();
- jiaojiao.setName("李娇娇");
- Proxy daili = new Proxy(jiaojiao);
- daili.giveDolls();
- daili.giveFlowers();
- daili.giveChocolate();
- }
最后更新:2017-04-03 12:55:04