案例:A喜欢C,C不认识A,AB相互认识,BC相互认识, A->B->C,即A让B帮忙送东西给C来追C
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
Subject 类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
RealSubject类,定义Proxy所代表的真实实体。
Proxy类,保存一个引用的代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
package Proxy; public class MainClass { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SchoolGirl jiaojiao = new SchoolGirl(); jiaojiao.setName("jiaojiao"); Proxy daili = new Proxy(jiaojiao); daili.GiveDolls(); daili.GiveFlowers(); daili.GiveChocolate(); } } interface GiveGift { void GiveDolls(); void GiveFlowers(); void GiveChocolate(); } class Pursuit implements GiveGift { SchoolGirl mm; public Pursuit(SchoolGirl mm) { this.mm = mm; } @Override public void GiveDolls() { // TODO Auto-generated method stub System.out.println(mm.getName()+"give dolls"); } @Override public void GiveFlowers() { // TODO Auto-generated method stub System.out.println(mm.getName()+"give flowers"); } @Override public void GiveChocolate() { // TODO Auto-generated method stub System.out.println(mm.getName()+"give chocolate"); } } class SchoolGirl { private String name; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } } class Proxy implements GiveGift { Pursuit gg; public Proxy(SchoolGirl mm) { gg = new Pursuit(mm); } @Override public void GiveDolls() { // TODO Auto-generated method stub gg.GiveDolls(); } @Override public void GiveFlowers() { // TODO Auto-generated method stub gg.GiveFlowers(); } @Override public void GiveChocolate() { // TODO Auto-generated method stub gg.GiveChocolate(); } }
简单说来,代理持有被代理对象的引用,代理对象调用持有被代理对象的引用来调用被代理对象的方法,其中,代理对象和被代理对象要实现共同接口。
代理模式的应用:
1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。html网页中未打开的图片框,荣国虚拟代理替代真实图片,此事代理存储了真实图片的路径和尺寸。
3.安全代理,用来控制真实对象访问时的权限。
4.智能指引,是指当调用真实的对象时,代理处理另外一些事。