代理模式(Proxy):为其他对象提供一种代理一控制对这个对象的访问。它可以控制真实对象的访问权限、隐藏信息、做额外的操作。
UML图:
package com.thpin.repository.designpattern;
public class ProxyDemo {
public static void main(String[] args) {
SchoolGirl mm = new SchoolGirl();
mm.setName("娇娇");
GiveGigt proxy = new Proxy(mm);
proxy.giveFlowers();
}
}
/*
* 妹妹漂亮又单纯
*/
class SchoolGirl {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/*
* 送礼物接口
*/
interface GiveGigt {
void giveFlowers();
}
/*
* 追求者
*/
class Pursuit implements GiveGigt {
private SchoolGirl mm;
public Pursuit(SchoolGirl mm) {
this.mm = mm;
}
public void giveFlowers() {
System.out.println(mm.getName() + "送你花(✿◡‿◡)");
}
}
/*
* 代理,一般是帮忙送情书、送花的跑腿儿
*/
class Proxy implements GiveGigt {
private Pursuit gg;
public Proxy(SchoolGirl mm) {
gg = new Pursuit(mm);
}
public void giveFlowers() {
System.out.println("这是傻缺送你的礼物");
gg.giveFlowers();// 这里才是真追求者的动作
giveChocolate();// 代理的巧克力
confession();// 代理的表白
}
private void giveChocolate() {
System.out.println("等等!他送的花不好看,这是我送你的德芙O(∩_∩)O哈哈~ ");
}
private void confession() {
System.out.println("让我替他做你男朋友啊。。。");
}
}
结果:
这是傻缺送你的礼物
娇娇送你花(✿◡‿◡)
等等!他送的花不好看,这是我送你的德芙O(∩_∩)O哈哈~
让我替他做你男朋友啊。。。
故事的整个过程没有见到真正的追求者(pursuit),这样保护了pursuit以免尴尬或者被骂。代理(Proxy)不但替追求者送了花,还做了自己该做的事情。注意实际应用中代理的行为是可控的,没这么不地道!