定义
为其它的对象提供一种代理,以控制这个对象的访问
使用场景
当不想直接访问某个对象的时候,就可以通过代理
1.不想买午餐,同事帮忙带
2.买车不用去厂里,去4s店
3.去代理点买火车票,不用去车站
UML
介绍下上面的UML图的意思,以购买火车票为例:
定义代理的接口,买票
(1)IProxy
代理的对象,完成代理的任务,设置具体的代理,调用具体的代理方法等
(2)ProxyObject
被代理对象,处理具体的业务逻辑
(3)RealObject
代码实现
上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:
(1)定义代理接口
package com.zengtao.demo.proxy; public interface IProxy { void buyTicket(); }
(2)代理类
package com.zengtao.demo.proxy; /** * 代理 */ public class Proxy implements IProxy { private RealProxy realClient; public Proxy(RealProxy realClient) { this.realClient = realClient; } @Override public void buyTicket() {
//befer 处理其他逻辑 realClient.buyTicket();
//after 处理其他逻辑 } }
(3)被代理对象买票
package com.zengtao.demo.proxy; import com.zengtao.demo.bean.User; /** * 具体代理买票 */ public class RealProxy implements IProxy { private User user; public RealProxy() { } public RealProxy(User user) { this.user = user; } public void setUser(User user) { this.user = user; } @Override public void buyTicket() { // 具体实现逻辑 if (user != null) { System.out.println("***********我要买票***********"); System.out.println("信息如下:"); System.out.println("姓名:" + user.getName()); System.out.println("性别:" + user.getSex()); System.out.println("身份证号:" + user.getCardCode()); System.out.println("住址:" + user.getHomeAddress()); System.out.println("***********信息已核对***********"); System.out.println("出票成功:动车D2222次09车20A"); } } }
(4)用户对象
package com.zengtao.demo.bean; import java.io.Serializable; @SuppressWarnings("serial") public class User implements Serializable { private String cardCode; private String name; private String homeAddress; private String sex; public String getCardCode() { return cardCode; } public void setCardCode(String cardCode) { this.cardCode = cardCode; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getHomeAddress() { return homeAddress; } public void setHomeAddress(String homeAddress) { this.homeAddress = homeAddress; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
(6)具体调用
package com.zengtao.demo; import com.zengtao.demo.bean.User; import com.zengtao.demo.proxy.Proxy; import com.zengtao.demo.proxy.RealProxy; public class Main { public static void main(String[] str) { // 用户信息 User user = new User(); user.setCardCode("510522177709096836"); user.setSex("男"); user.setName("无名氏"); user.setHomeAddress("地球村第七号店铺"); // 具体代理 RealProxy realClient = new RealProxy(); realClient.setUser(user); // 代理 Proxy proxy = new Proxy(realClient); proxy.buyTicket(); } }
(7)结果
以上以代理模式的方式,简陋的实现了购票的流程。
总结
大家也可以看到,其实代理模式,说白了就是委托,将所有的事情都委托给别人帮你完成,你所要做的,就是给代理一些东西,接下来所有的事情都是代理帮你完成,你完全不用去关心内部是如何实现的。
代理模式:一般可以分为两种,一种为静态代理,一种为动态代理
(1)静态代理
静态代理:就是我们上述所写的,代理代码是由我们自己去生成的固定的代码进行编译
(2)动态代理
动态代理:动态代理,跟静态代理相反,它是用反射机制动态的生成代理的对象,我们不需要知道谁代理谁