1.代理模式:为其他对象提供一种代理以控制对这个对象的访问。
2.结构图
3.例子
/**
* 抽象角色:提供代理角色和真实角色对外提供的公共方法
*/
public interface Star {
void confer();//面谈
void signContract();//签合同
void bookTicket();//订票
void sing();//唱歌
void collectMoney();//收尾款
}
//代理角色实现类
public class ProxyStar implements Star {
private Star star; // 真实对象的引用(明星)
public ProxyStar(Star star) {// 通过构造器给真实角色赋值
this.star = star;
}
@Override
public void sing() {
star.sing();// 真实对象的操作(明星唱歌)
}
@Override
public void confer() {
System.out.println("ProxyStar.confer()");
}
@Override
public void signContract() {
System.out.println("ProxyStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("ProxyStar.bookTicket()");
}
@Override
public void collectMoney() {
System.out.println("ProxyStar.collectMoney()");
}
}
//真实角色(明星艺人)
public class RealStar implements Star {
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("RealStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("张学友.sing()");// 真实角色的操作:真正的业务逻辑
}
@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
public class MainTest {
public static void main(String[] args) {
Star real = new RealStar();
Star proxy = new ProxyStar(real);
proxy.confer();
proxy.signContract();
proxy.bookTicket();
proxy.sing();// 真实对象的操作(明星唱歌)
proxy.collectMoney();
}
}
/*ProxyStar.confer()
ProxyStar.signContract()
ProxyStar.bookTicket()
张学友.sing()
ProxyStar.collectMoney()*/
3.代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。代理就是真实对象的代表。