为他人做嫁衣
小明 男
小龙 男
小红 女
大学里,小龙学习成绩好,经常给小红补课,而小明跟小龙是好朋友,小明想追求小红,就每次委托小龙给小红代送礼物,久而久之,小红喜欢上了小龙,却把经常送礼物的小明给抛弃了,小明的做法到头来却给别人做了嫁衣
这个故事用java中的模式来解释,就是代理模式
小龙和小明都有送礼物的方法,所以把送礼物的动作提出来为一个接口,而小龙(代理)送的礼物实际上是来自于小明(追求者),
上代码
1.定义一个送礼物的接口GiveGift
/**
* 定义一个送礼的接口
* @author Administrator
*
*/
public interface GiveGift {
public void GiveDolls();
public void GiveFlowers();
public void GiveChocolate();
}
2.定义一个mm(小红)
/**
* 被追对象
* @author Administrator
*
*/
public class Girl {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.定义一个追求者Pursuit实现送礼接口
/**
* 追求者
* @author Administrator
*
*/
public class Pursuit implements GiveGift {
public Girl mm;
/**
* 构造方法 给mm送礼,对象是mm
* @param mm
*/
public Pursuit(Girl mm) {
this.mm = mm;
}
@Override
public void GiveDolls() {
System.out.println("小明送的狗熊");
}
@Override
public void GiveFlowers() {
System.out.println("小明送的玫瑰");
}
@Override
public void GiveChocolate() {
System.out.println("小明送的巧克力");
}
}
4.代理者(小龙)也有送礼的动作实现送礼接口
/**
* 代理者
* @author Administrator
*
*/
public class Proxy implements GiveGift{
public Pursuit gg;
/**
* 构造方法 代小明给mm送礼,对象是mm
* @param mm
*/
public Proxy(Girl mm) {
gg = new Pursuit(mm);
}
@Override
public void GiveDolls() {
gg.GiveDolls();
}
@Override
public void GiveFlowers() {
gg.GiveFlowers();
}
@Override
public void GiveChocolate() {
gg.GiveChocolate();
}
}
5.测试
public class Test {
public static void main(String[] args) {
Girl mm = new Girl();
mm.setName("小红");
//小龙(代理者)给小红送礼物
//事实上送的礼物是小明的
Proxy xl = new Proxy(mm);
xl.GiveDolls();
xl.GiveFlowers();
xl.GiveChocolate();
}
}
测试结果,在测试时,创建代理者给mm送礼,事实上送的礼物都是小明送的,,这种方式就是代理模式,对于小红而言,不需要知道追求她的人是谁,却可以通过代理人得到礼物
代理模式 为其他对象通过一种代理以控制对这个对象的访问
Subject 类定义了RealSubject和Proxy公用的接口,这样就在任何使用RealSubject的地方都可以使用Prox
1.定义一个抽象类
public abstract class Subject {
public abstract void Request();
}
2.定义一个真实的请求
public class RealSubject extends Subject {
@Override
public void Request() {
System.out.println("真实的访问请求");
}
}
3.定义一个代理
public class Proxy extends Subject {
public RealSubject realSubject;
@Override
public void Request() {
if(realSubject ==null){
realSubject = new RealSubject();
}
realSubject.Request();
}
}
4.测试
public class Test {
public static void main(String[] args) {
Proxy px = new Proxy();
px.Request();
}
}
总结一下
代理模式应用的场合
1.远程代理,也就是为了一个对象在不同的地址空间提供局部代理,这样就可以隐藏一个对象存在于不同的地址空间的事实
2.虚拟代理,根据需要创建开销很大的对象,通过她来存放实例化需要很长时间的真实对象,比如在打开一个很大的HTML网页时,里面有很多文字和图片,你可以很快打开,看到的是所有的文字,但图片确实一张一张的下载后才能看到,那些没打开的图片框,就是通过虚拟代理代替了真实的图片,此时代理存储了真实图片的路径和尺寸
3.安全代理,用来控制真实对象访问是的权限
一般用于对象应该有不同的访问权限的时候
4.智能指引,是指当调用真实对象时,代理处理另外一些事
代理模式实际上就是在访问对象时,可以附加多种用途