设计模式之我见--4代理模式

2014-11-24 08:22:17 · 作者: · 浏览: 1

本文所写都是自己的理解,可能会有错误,如果有错误请指出。

编程中我们可能去调用一个自己不能直接访问的类的方法或者类的开发者不想直接将类暴露给用户,这时候一般就可以开发一个被调用类的代理,然后通过控制对这个代理类的访问来控制对实际类的访问。这个代理类同时认识这两个类充当了这两个类之间的桥梁的作用。代理模式是对其他对象提供一种代理以控制对这个对象的访问。

下面通过类比来介绍一下这个模式。有一个GG想追求一个MM,但是她又不认识,这时候就找了一个中间人,这个中间人认识这两个人。这个GG想送这个MM洋娃娃,巧克力,鲜花,但是自己又不敢,所以就找了一个中间人,同样这个中间人也会送洋娃娃,巧克力,鲜花,但是实际执行的是这个MM的方法。

下面看一下这个的类图和代码。

[java]
package loveproxy;

interface IGiveGift {
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}

[java]
package loveproxy;

class Pursuit implements IGiveGift {
SchoolGirl mm ;
public Pursuit(SchoolGirl mm) {
this.mm = mm;
}
@Override
public void GiveDolls() {
System.out.println(mm.getName()+",送你洋娃娃");
}
@Override
public void GiveFlowers() {
System.out.println(mm.getName()+",送你鲜花");
}
@Override
public void GiveChocolate() {
System.out.println(mm.getName()+",送你巧克力");
}
}

[java]
package loveproxy;

class Proxy implements IGiveGift {
Pursuit gg;
public Proxy(SchoolGirl mm) {
this.gg = new Pursuit(mm);
}
@Override
public void GiveDolls() {
gg.GiveDolls();
}
@Override
public void GiveFlowers() {
gg.GiveFlowers();
}
@Override
public void GiveChocolate() {
gg.GiveChocolate();
}
}

[java]
package loveproxy;

class SchoolGirl {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

[java]
package loveproxy;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
SchoolGirl mm = new SchoolGirl();
mm.setName("Big Beauty");

Proxy proxy = new Proxy(mm);
proxy.GiveDolls();
proxy.GiveFlowers();
proxy.GiveChocolate();

}

}
运行结果:
[java]
Big Beauty,送你洋娃娃
Big Beauty,送你鲜花
Big Beauty,送你巧克力

代理类实现与被代理类相同的接口,并且含有一个被代理类的引用,这样就可以使用代理类来代替实体类进行操做了。我们可以在代理类中加入一些对应的逻辑或者相应的权限验证。
作者:mengxiangyue