代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式有以下三种角色组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理模式的UNL图表示:
下面是代理模式的一个应用,假设一个人通过另外一个人去送礼物给一个女孩,另外代理模式的一个使用较多的地方就是webservice
/**
* 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
* */
public interface GiveGift {
void giveDolls();
void giveFlowers();
void giveChocolate();
}
/**
* 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
* */
public class Pursuit implements GiveGift{
SchoolGirl schoolGirl;
public Pursuit(SchoolGirl schoolGirl){
this.schoolGirl=schoolGirl;
}
@Override
public void giveDolls() {
System.out.println(schoolGirl.getName()+",送你一个洋娃娃");
}
@Override
public void giveFlowers() {
System.out.println(schoolGirl.getName()+",送你一束花");
}
@Override
public void giveChocolate() {
System.out.println(schoolGirl.getName()+",送你一盒巧克力");
}
}
/**
* 代理角色:实现抽象角色,是真实角色的代理,
* 通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
* */
public class Proxy implements GiveGift{
Pursuit pursuit;
public Proxy(Pursuit pursuit){
this.pursuit=pursuit;
}
@Override
public void giveDolls() {
pursuit.giveDolls();
}
@Override
public void giveFlowers() {
pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
pursuit.giveChocolate();
}
}
/**
* 代理角色:实现抽象角色,是真实角色的代理,
* 通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
* */
public class Proxy implements GiveGift{
Pursuit pursuit;
public Proxy(Pursuit pursuit){
this.pursuit=pursuit;
}
@Override
public void giveDolls() {
pursuit.giveDolls();
}
@Override
public void giveFlowers() {
pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
pursuit.giveChocolate();
}
}
测试类:
public class Test {
public static void main(String[] args) {
SchoolGirl schoolGirl=new SchoolGirl();
schoolGirl.setName("张美女");
//代理类
Proxy proxy=new Proxy(new Pursuit(schoolGirl));
proxy.giveChocolate();
proxy.giveDolls();
proxy.giveFlowers();
}
}
输出:
张美女,送你一盒巧克力
张美女,送你一个洋娃娃
张美女,送你一束花