代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。在该模式中,代理类代表了一个真实主题(Real Subject),并提供了与真实主题相同的接口,以便在客户端调用时可以透明地替代真实对象。
抽象提取理论:
代码需求:追女孩~ 小明喜欢软软,但是小明很害羞,希望通过小硬送礼物给软软。如果用代码实现这个流程,如何实现呢?
代理实现
代码结构图
代码实现:
/**
* 送礼物接口
*/
public interface IGift {
/**
* 送洋娃娃
*/
void giveDolls();
/**
* 送鲜花
*/
void giveFlowers();
/**
* 送巧克力
*/
void giveChocolate();
}
/**
* 追求者-小明
*/
public class Suitor implements IGift{
/**
* 追求的对象
*/
private ThePursued thePursued;
public Suitor (ThePursued thePursued){
this.thePursued = thePursued;
}
@Override
public void giveDolls() {
System.out.println(thePursued.getName() + "我给你送洋娃娃");
}
@Override
public void giveFlowers() {
System.out.println(thePursued.getName() + "我给你送鲜花");
}
@Override
public void giveChocolate() {
System.out.println(thePursued.getName() + "我给你送巧克力");
}
}
/**
* 被追求者-软软
*/
public class ThePursued {
private String name;
public ThePursued(String name){
this.name = name;
}
public String getName(){
return name;
}
}
/**
* 代理-小硬
* 同时有追求者和被追求者信息
*/
public class Proxy implements IGift{
// 追求者
private Suitor suitor;
/**
* 获取被追求者信息
*/
public Proxy(ThePursued thePursued){
suitor = new Suitor(thePursued);
}
@Override
public void giveDolls() {
suitor.giveDolls();
}
@Override
public void giveFlowers() {
suitor.giveFlowers();
}
@Override
public void giveChocolate() {
suitor.giveChocolate();
}
}
/**
* 客户端-测试
*/
public class ProxyDemo {
public static void main(String[] args) {
// 被追求者
ThePursued thePursued = new ThePursued("软软");
// 代理
Proxy proxy = new Proxy(thePursued);
proxy.giveChocolate();
proxy.giveDolls();
proxy.giveFlowers();
}
}
输出结果:
Connected to the target VM, address: '127.0.0.1:30065', transport: 'socket'
软软我给你送巧克力
软软我给你送洋娃娃
软软我给你送鲜花
Disconnected from the target VM, address: '127.0.0.1:30065', transport: 'socket'