代理模式Proxy入门 之帮你追求心仪的姑娘
2016-03-06 00:39
549 查看
话说村里有个姑娘叫小芳,长得好看又漂亮。不少男孩想追她,送花、约她看电影、共进晚餐都被一一拒绝了,人家小芳是个矜持的姑娘,毕竟跟这些男孩也不熟啊。这时,着急的男孩想到一个好办法,通过一个代理人(媒婆,或是小芳的闺蜜啊)约小芳啊。问题引刃而解了,下面就结合这个故事说一说设计模式中的 代理模式Proxy。
Subject :抽象主题角色,抽象主题类可以是抽象类,也可以是接口,声明了真实对象和代理对象的共同接口。
RealSubject:真实对象角色,即我们要操作的对象实例,它是被Proxy代理和控制访问的对象。
Proxy:代理角色:代理对象角色内部持有对真实对象的引用,通过和真实对象实现了同一个接口,在任何时刻都能代替真实对象。
接着的追求小芳的男孩,这里定义为一个客户,实现上述方法
实现一个Girl类(小芳)
然后就是我们的代理,同样需要实现约会行为接口,并持有一个Client对象
一切就绪,代理人开始替客户(男孩)去约小芳了
通过上面方法,可以看到代理对象proxy调用了约会的方法,可最终实现该动作的是 Client(男孩)对象。一个最基础的代理例子就演示完了,是不是很简单。此处需要记住的就是 实际角色和代理角色实现了同一个接口,并且在代理对象持有实际角色对象,在代理中实际控制的是实际角色对象的访问。
不足之处,欢迎大家批评指正。
代理模式 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(男孩)对象。一个最基础的代理例子就演示完了,是不是很简单。此处需要记住的就是 实际角色和代理角色实现了同一个接口,并且在代理对象持有实际角色对象,在代理中实际控制的是实际角色对象的访问。
不足之处,欢迎大家批评指正。