话说村里有个姑娘叫小芳,长得好看又漂亮。不少男孩想追她,送花、约她看电影、共进晚餐都被一一拒绝了,人家小芳是个矜持的姑娘,毕竟跟这些男孩也不熟啊。这时,着急的男孩想到一个好办法,通过一个代理人(媒婆,或是小芳的闺蜜啊)约小芳啊。问题引刃而解了,下面就结合这个故事说一说设计模式中的 代理模式Proxy。
代理模式 Proxy
定义:为一个对象提供一个代表以控制对这个对象的访问。
UML图
Subject :抽象主题角色,抽象主题类可以是抽象类,也可以是接口,声明了真实对象和代理对象的共同接口。
RealSubject:真实对象角色,即我们要操作的对象实例,它是被Proxy代理和控制访问的对象。
Proxy:代理角色:代理对象角色内部持有对真实对象的引用,通过和真实对象实现了同一个接口,在任何时刻都能代替真实对象。
代码实现案例
首先明确小伙明确小伙追求小芳有哪些行为:送花、看电影、共进晚餐,需求很明确,将其抽取到接口中
public interface IMeet {
/** 送花 */
void giveFlower();
/** 一起晚餐 */
void haveDinner();
/** 看电影 */
void watchMoive();
}
接着的追求小芳的男孩,这里定义为一个客户,实现上述方法
public class Client implements IMeet {
private Girl girl;
public Client(Girl girl) {
super();
this.girl = girl;
}
@Override
public void giveFlower() {
System.out.println(girl.getName() + " 送你一枝玫瑰");
}
@Override
public void haveDinner() {
System.out.println(girl.getName() + " 请你共进晚餐");
}
@Override
public void watchMoive() {
System.out.println(girl.getName() + " 请你看电影");
}
}
实现一个Girl类(小芳)
public class Girl {
private String name;
public Girl(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
}
然后就是我们的代理,同样需要实现约会行为接口,并持有一个Client对象
public class Proxy implements IMeet {
// 持有对 被代理对象
private Client client;
public Proxy(Girl girl) {
super();
client = new Client(girl);
}
@Override
public void giveFlower() {
client.giveFlower();
}
@Override
public void haveDinner() {
client.haveDinner();
}
@Override
public void watchMoive() {
client.watchMoive();
}
}
一切就绪,代理人开始替客户(男孩)去约小芳了
/**
* 村里有个姑娘叫小芳,长得好看又漂亮。
*/
public static void main(String[] args) {
Girl girl = new Girl("小芳");
Proxy proxy = new Proxy(girl);
proxy.giveFlower();
proxy.watchMoive();
proxy.haveDinner();
}
结果:
小芳 送你一枝玫瑰
小芳 请你看电影
小芳 请你共进晚餐
通过上面方法,可以看到代理对象proxy调用了约会的方法,可最终实现该动作的是 Client(男孩)对象。一个最基础的代理例子就演示完了,是不是很简单。此处需要记住的就是 实际角色和代理角色实现了同一个接口,并且在代理对象持有实际角色对象,在代理中实际控制的是实际角色对象的访问。
不足之处,欢迎大家批评指正。