设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。
在上一篇已经大概讲解了代理模式,相信大家对代理模式有一定的了解了,如果没有
不妨先去看看上一篇 设计模式之代理模式(静态代理)
相信大家肯定有收获,如果有了一定的基础,那么在去看,相信理解会更加快,而且非常容易明白。
因为上一篇已经比较详细的分析过了,所以直接上代码了
(1)定义代理接口
package com.zengtao.demo.proxy;
public interface IProxy {
void buyTicket();
}
(2)动态代理
package com.zengtao.demo.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 动态代理
*/
public class DynamicProxy implements InvocationHandler {
private Object obj;
public DynamicProxy(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(obj, args);
}
}
(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)bean
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;
}
}
(5)具体调用
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("地球村第七号店铺");
// 创建买票者
IProxy zhangsan = new RealProxy(user);
// 创建动态代理
DynamicProxy proxy = new DynamicProxy(zhangsan);
// 获取被代理的classloader
ClassLoader loader = zhangsan.getClass().getClassLoader();
// 动态构建一个代理站点
IProxy iProxy = (IProxy) Proxy.newProxyInstance(loader, new Class[] { IProxy.class }, proxy);
iProxy.buyTicket();
}
}
静态代理和动态代理,他们是从code的本质上去区分的,所以,这两种的区别也是从代码上的实现方式不同。
我们可以看到,在动态代理的实现实现了InvocationHandler这个接口,这个接口呢,也是Java自身给我们提供的一个便捷的动态代理接口,实现该接口,只需重写和调用其方法invoke就可以了
而我也在上一篇文章中说到动态代理模式是:通过反射机制动态的生成代理者的对象,我们在code阶段的时候,是不需要知道是谁代理谁,具体代理谁,我们会在执行的时候决定。
所以,我们使用object作为参数传入,并且在调用的时候,也是根据反射,获取代理类的classloader获取的,然后动态的构造代理,然后进行调用buyTicket()买票方法的
补充:
1、从code区分
代理分为:静态代理和动态代理
2、适用范围
远程代理:对象在不同的内存地址空间提供局部代理,使得系统可以将Server部分实现隐藏
虚拟代理:对象在真正需要的时候创建,但是又十分消耗资源的时候
保护代理:使用代理控制对对象的访问权限
智能引用:访问对象时,加上一些自己的执行操作并对指向原始对象的引用计数
以上就是代理模式的基本知识点和实现方式。。。