本文转载自点击打开链接
需求
模拟男孩代别人送礼物给女孩。
实现
public class SchoolGirl { public String name; public String getName() { return this.name; } public void setName(String name) { this.name=name; } }
public interface GiveGift { void giveDolls(); void giveFlowers(); void giveChocolate(); }
public class Pursuit implements GiveGift { SchoolGirl mm; public Pursuit(SchoolGirl 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+" 送你巧克力"); } }
public class Proxy implements GiveGift { Pursuit gg; public Proxy(SchoolGirl mm) { gg=new Pursuit(mm); } public void giveChocolate() { gg.giveChocolate(); } public void giveDolls() { gg.giveDolls(); } public void giveFlowers() { gg.giveFlowers(); } }
public class Main { public static void main(String[] args) { SchoolGirl jiaojiao=new SchoolGirl(); jiaojiao.setName("李娇娇"); Proxy daili=new Proxy(jiaojiao); daili.giveDolls(); daili.giveFlowers(); daili.giveChocolate(); } }代理模式,为其他对象提供一种代理以控制对这个对象的访问。一般来说可以分为以下几种:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,这样就可以达到性能的最优化。安全代理,用来控制真实对象访问时的权限,一般用于对象应该有不同的访问权限的时候。智能代理,是指当调用真实对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。
//Subject类,定义了RealSubject和Proxy的共用接口 public interface Subject { public void request(); } //RealSubject类,定义Proxy所代表的真实实体 public class RealSubject implements Subject { public void request() { System.out.println("真实的请求"); } } //Proxy类,保存一个引用使用代理可以访问实体,并提供一个与Subject的接口相同的接口 public class Proxy implements Subject { RealSubject realSubject; public void request() { if(null==realSubject) { realSubject=new RealSubject(); } realSubject.request(); } } //客户端代码 public class Main { public static void main(String[] args) { Proxy proxy=new Proxy(); proxy.request(); } }回顾我们前面提到的装饰模式,可以发现代理模式和装饰模式有很多相似之处。对装饰模式来说,装饰者和被装饰者都实现同一个接口;对代理模式来说,代理类和真实处理的类都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。实际上,装饰模式和代理模式还是有很多差别的。装饰模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说,当我们使用代理模式的时候,常常在一个代理类中创建一个对象的实例,代理类可以对它的客户隐藏一个对象的具体信息;当我们使用装饰模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。