您的位置:首页 > 其它

代理模式Proxy入门 之帮你追求心仪的姑娘

2016-03-06 00:39 549 查看
话说村里有个姑娘叫小芳,长得好看又漂亮。不少男孩想追她,送花、约她看电影、共进晚餐都被一一拒绝了,人家小芳是个矜持的姑娘,毕竟跟这些男孩也不熟啊。这时,着急的男孩想到一个好办法,通过一个代理人(媒婆,或是小芳的闺蜜啊)约小芳啊。问题引刃而解了,下面就结合这个故事说一说设计模式中的 代理模式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(男孩)对象。一个最基础的代理例子就演示完了,是不是很简单。此处需要记住的就是 实际角色和代理角色实现了同一个接口,并且在代理对象持有实际角色对象,在代理中实际控制的是实际角色对象的访问。

不足之处,欢迎大家批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: