什么是代理模式
为其它对象提供一种代理以控制这个对象的访问;在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
简单解释
- 抽象角色:通过抽象或接口来生声明的具体业务实现方法;
- 代理角色:实现抽象或接口定义的方法,是真实的代理角色,通过调用调用真实角色来实现具体的业务操作,并附加自己的操作;
- 真实角色:实现抽象或接口定义的具体业务方法,供代理角色来调用;
UML类图

优点
- 真实的角色实现实际的业务逻辑,不需要关心其它非本职之外的业务逻辑操作,通过后期代理实现业务逻辑控制,使逻辑更加清晰明了;
- 代理角色在客户端与目标对象之间起了中介作用,这样中介的作用保护了目标对象;
代码实现
参照大话设计模式,以送礼物为例;
- 创建一个抽象类,定义具体的送礼物的方法
/**
* 定义一下抽象方法,声明具体的实现
* 送实物抽象方法
* @author ws
* @version
*/
public abstract class IGiveGift {
public abstract void giveDools();
public abstract void giveFlowers();
public abstract void giveChocolate();
}
- 定义一个具体的实现类,继承抽象类,实现其送礼物的方法
/**
* 继承并实现送礼物的方法
* @author ws
* @version 1.0
*/
public class Pursuit extends IGiveGift {
private String name;
public Pursuit(String name){
this.name=name;
}
@Override
public void giveDools() {
System.out.println(String.format("%s,送你的娃娃",name));
}
@Override
public void giveFlowers() {
System.out.println(String.format("%s,送你的花",name));
}
@Override
public void giveChocolate() {
System.out.println(String.format("%s,送你的巧克力",name));
}
}
- 定义一个代理类,并且引入具体的实现类,继承抽象类,也实现其送礼物的方法
/**
* 继承抽象类,同时引入实际业务操作类
* @author ws
* @version 1.0
*/
public class ProxyGiveGift extends IGiveGift {
private Pursuit pursuit;
private String name;
public ProxyGiveGift(String name){
this.name=name;
pursuit=new Pursuit(name);
}
@Override
public void giveDools() {
pursuit.giveDools();
}
@Override
public void giveFlowers() {
pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
pursuit.giveChocolate();
}
}
- 执行结果
public static void main(String[] args) {
ProxyGiveGift proxy=new ProxyGiveGift("小花");
proxy.giveDools();
proxy.giveChocolate();
proxy.giveFlowers();
}
//------------
小花,送你的娃娃
小花,送你的巧克力
小花,送你的花
参照:大话设计模式,菜鸟教程