调用到了S的方法,只是不是自己直接调用,而是通过代理P调用的。
功能方法,故对RealSubject的某个方法的访问,就能转为Proxy同名的方法调用。
功能方法里面调用RealSubject的同名方法,从而实现代理的功能。
性能的最优化。比如,打开一个很大的HTML网页时,里面虽然有很多图片和文字,但是还是可以很快打开,开始你看到的是所有的文字,图片其实是一张张下载下来的。那些未打开的图片框,就是通过虚拟代理替代了真实的图片,此时代理保存了真实图片的地址和尺寸。
调用真实对象时,代理处理另外一些事情。如计算真实对象的引用次数,这样当对象没有引用时,可以自动释放它;或当第一次引用一个对象时,把它加入内存等等。它们都是通过代理在访问一个对象时附加一些内务处理。
SchoolGirl
/**
/**
-
@Author: cxh
-
@CreateTime: 18/1/3 20:58
-
@ProjectName: JavaBaseTest
*/
public class Gift {
//礼物接口
Gift(){}
void giveChocolate(){};
void giveDolls(){};
void giveFlowers(){};
}
/**
-
@Author: cxh
-
@CreateTime: 18/1/3 21:00
-
@ProjectName: JavaBaseTest
*/
public class Persuit extends Gift {
private SchoolGirl schoolGirl;
Persuit(SchoolGirl girl){
this.schoolGirl=girl;
}
@Override
public void giveChocolate() {
System.out.println("persuit gives chocolate");
}
@Override
public void giveDolls() {
System.out.println("persuit gives dolls");
}
@Override
public void giveFlowers() {
System.out.println("persuit gives flowers");
}
}
/**
-
@Author: cxh
-
@CreateTime: 18/1/3 21:01
-
@ProjectName: JavaBaseTest
*/
public class Proxy extends Gift {
private Persuit persuit;
Proxy(SchoolGirl girl){
persuit=new Persuit(girl);
}
@Override
public void giveChocolate() {
persuit.giveChocolate();
}
@Override
public void giveDolls() {
persuit.giveDolls();
}
@Override
public void giveFlowers() {
persuit.giveFlowers();
}
}
/**
- @Author: cxh
- @CreateTime: 18/1/3 21:02
- @ProjectName: JavaBaseTest
*/
public class SchoolGirl {
private String name;
SchoolGirl(String name){
this.name=name;
}
}
<span style="font-size:14px;">
输出:
Process finished with exit code 0
<span style="font-size:14px;">