代理逻辑——为他人做嫁衣
定义
为其他对象提供一种代理以控制对这个对象的访问。
UML图
用例
需要实现一个代理送礼物系统,A想送礼物给B但不敢自己去,需要C代理送礼物,但礼物是A的。
代理接口
interface IGiveGift(){
void giveDolls();
void giveFlowers();
void giveChocolate();
}
被追求者类
class Girl{
private name;
public String getName(){
return name;
}
public String setName(String name){
this.name = name;
}
}
追求者
class Pursuit : IGiveGift{
girl mm;
public Pursuit(girl 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 + "送你巧克力");
}
}
代理类
class Proxy : IGiveGift{
Pursuit gg;
public Proxy(Girl mm){//保存一个引用使得代理者可以访问被追求者实体
gg = new Proxy(mm);
}
public void giveDolls(){//提供相同的接口代理调用追求者本身的函数
gg.giveDolls();
}
public void giveFlowers(){
gg.giveFlowers();
}
public void giveChocolate(){
gg.giveChocolate();
}
}
客户端
public static void Main(String[] args){
Girl jiaojiao = new Girl();
jiaojiao.name = "李娇娇";
Proxy daili = new Proxy(jiaojiao);
daili.giveDolls();
daili.giveFlowers();
daili.giveChocolate();
}
UML图——送礼物
总结
代理模式适用的场合
- 远程代理,为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理,根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
- 安全代理,用来控制真实对象访问时的权限。
- 智能指引,当调用真实的对象时,代理处理另一些事情。例如计算真实对象的引用次数,这样当真实对象没有引用时,可以释放它;或在第一次引用一个持久的对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变他。类似这种,都是在访问一个对象时附加一些内务处理。