JAVA设计模式——代理(静态代理)
定义
为其它的对象提供一种代理,以控制这个对象的访问
使用场景
当不想直接访问某个对象的时候,就可以通过代理
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 ProxyObject implements IProxy { private RealProxy realClient; public Proxy(RealProxy realClient) { this.realClient = realClient; }
public setRealObject(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();
proxy.setRealObject(realClient);
proxy.buyTicket();
}
}
(7)结果
以上以代理模式的方式,简陋的实现了购票的流程。
总结
大家也可以看到,其实代理模式,说白了就是委托,将所有的事情都委托给别人帮你完成,你所要做的,就是给代理一些东西,接下来所有的事情都是代理帮你完成,你完全不用去关心内部是如何实现的。
代理模式:一般可以分为两种,一种为静态代理,一种为动态代理
(1)静态代理
静态代理:就是我们上述所写的,代理代码是由我们自己去生成的固定的代码进行编译
(2)动态代理
动态代理:动态代理,跟静态代理相反,它是用反射机制动态的生成代理的对象,我们不需要知道谁代理谁
每次的困难都是实力的提升,每次的消极过后都是心态的升华;