代理模式:为其他对象提供一种代理以控制对这个对象的访问。代理一般分为几种:远程代理、虚拟代理、安全代理等。
远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化,比如说打开一个很大的html网页,里面有很多图片和文字,但还是可以很快的打开它,此时看到的是文字但是图片是一张张的加载的,那些未打开的图片框就是通过虚拟代理来替代了真实的图片,此时的代理存储了真实图片的路径和大小。
安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同访问权限的时候。
智能指引:指当调用真实的对象时,代理处理另外一些事。
示例:proxyer是代理者,pursuid是真实追求者,schoolgirl是被追求者;被追求者并不认识真实追求者但是认识代理者,追求者请求代理者帮忙追求schoolgirl:
// 定义被追求者
class schoolgirl
{
private String name;
schoolgirl(String name)
{
this.name = name;
}
void getflavor()
{
System.out.println("接收送花!");
}
}
// 定义接口,抽象出代理和被代理的方法
interface behavor
{
public abstract void sendflavor();
public abstract void senddoll();
public abstract void sendgift();
}
// 追求者类内部传入被追求者的引用和定义方法
class pursuid implements behavor
{
schoolgirl shgirl;
pursuid(schoolgirl girl)
{
this.shgirl = girl;
}
public void sendflavor()
{
System.out.println("送花");
}
public void senddoll()
{
System.out.println("送洋娃娃");
}
public void sendgift()
{
System.out.println("送礼物");
}
}
// 定义代理,通过传入被追求者引用在内部定义追求者对象,并用追求者对象去实现方法提供给代理使用
class proxyer
{
pursuid gg;
proxyer(schoolgirl girl)
{
gg = new pursuid(girl);
}
public void sendflavor()
{
gg.sendflavor();
}
public void senddoll()
{
gg.senddoll();
}
public void sendgift()
{
gg.sendgift();
}
}
public class proxy
{
public static void main(String args[])
{
schoolgirl sg = new schoolgirl("小吖吖");
proxyer py = new proxyer(sg);
py.sendflavor();
py.senddoll();
py.sendgift();
}
}