代理模式
来源:互联网 发布:基因毒性杂质数据库 编辑:程序博客网 时间:2024/06/05 14:53
代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象,创建开销大的对象或者需要安全控制对象的访问。
我们举个例子来说明代理模式。假设现在有个社交网站,我们可以在上面注册并设置和查看自己的信息。别人也可以查看我们的信息,并对我们进行评分,但是我们不能给自己评分,当然别人也不能修改我们的个人信息。
我们实现的思路是创建个人信息的2个代理对象。一个代理对象是我们自己设置和查看个人信息的,不能给自己设置评分,另一个代理对象是可以允许查看我们的信息,并进行评分,但是不能修改个人信息。
1. 个人信息接口
public interface PersonBean { /**获取姓名**/ String getName(); /**获取性别**/ String getGender(); /**获取兴趣**/ String getInterests(); /**获得评分**/ int getHotOrNotRating(); /**设置姓名**/ void setName(String name); /**设置性别**/ void setGender(String gender); /**设置兴趣**/ void setInterests(String interests); /**设置评分**/ void setHotOrNotRating(int rating);}
2. 个人信息实现
public class PersonBeanImpl implements PersonBean{ private String name; private String gender; private String interests; private int rating; private int ratingCount = 0; public String getName() { return name; } public String getGender() { return gender; } public String getInterests() { return interests; } public int getHotOrNotRating() { return ratingCount == 0 ? 0 : rating/ratingCount; } public void setName(String name) { this.name = name; } public void setGender(String gender) { this.gender = gender; } public void setInterests(String interests) { this.interests = interests; } public void setHotOrNotRating(int rating) { ratingCount ++; this.rating += rating; } public PersonBeanImpl(String name, String gender, String interests) { super(); this.name = name; this.gender = gender; this.interests = interests; }}
3. 设置评分handler
public class NonOwnerInvocationHandler implements InvocationHandler{ private PersonBean personBean; public NonOwnerInvocationHandler(PersonBean personBean) { super(); this.personBean = personBean; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().startsWith("get")){ return method.invoke(personBean, args); }else if(method.getName().equals("setHotOrNotRating")){ return method.invoke(personBean, args); }else if(method.getName().startsWith("set")){ throw new IllegalAccessException("cant't set peronal information"); } return null; }}
4. 设置信息handler
public class OwnerInvocationHandler implements InvocationHandler{ private PersonBean personBean; public OwnerInvocationHandler(PersonBean personBean) { super(); this.personBean = personBean; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().startsWith("get")){ return method.invoke(personBean, args); }else if(method.getName().equals("setHotOrNotRating")){ throw new IllegalAccessException("can't set hot or not rating.."); }else if(method.getName().startsWith("set")){ return method.invoke(personBean, args); } return null; }}
5. 代理类
public class PersonBeanProxy { public static PersonBean getOwnerProxy(PersonBean personBean){ return (PersonBean) Proxy.newProxyInstance(personBean.getClass().getClassLoader(), personBean.getClass().getInterfaces(), new OwnerInvocationHandler(personBean)); } public static PersonBean getNonOwnerProxy(PersonBean personBean){ return (PersonBean) Proxy.newProxyInstance(personBean.getClass().getClassLoader(), personBean.getClass().getInterfaces(), new NonOwnerInvocationHandler(personBean)); }}
6. 测试
public class ProxyTest { public static void main(String[] args) { PersonBean person = new PersonBeanImpl("Jack","Male","bowling"); PersonBean ownerProxy = PersonBeanProxy.getOwnerProxy(person); System.out.println(ownerProxy.getName() + " " + ownerProxy.getGender() + " " + ownerProxy.getInterests()); ownerProxy.setInterests("reading"); System.out.println(ownerProxy.getName() + " " + ownerProxy.getGender() + " " + ownerProxy.getInterests()); try { ownerProxy.setHotOrNotRating(10); } catch (Exception e) { e.printStackTrace(); } System.out.println("-----------------------------------------"); PersonBean nonOwnerProxy = PersonBeanProxy.getNonOwnerProxy(person); System.out.println(nonOwnerProxy.getName() + " " + nonOwnerProxy.getGender() + " " + nonOwnerProxy.getInterests()); nonOwnerProxy.setHotOrNotRating(10); System.out.println(nonOwnerProxy.getHotOrNotRating()); try { nonOwnerProxy.setInterests("bowling"); } catch (Exception e) { e.printStackTrace(); } }}
7. 运行结果
Jack Male bowlingJack Male readingjava.lang.reflect.UndeclaredThrowableException at com.sun.proxy.$Proxy0.setHotOrNotRating(Unknown Source) at com.zs.pattern.proxy.ProxyTest.main(ProxyTest.java:18)Caused by: java.lang.IllegalAccessException: can't set hot or not rating.. at com.zs.pattern.proxy.OwnerInvocationHandler.invoke(OwnerInvocationHandler.java:21) ... 2 more-----------------------------------------Jack Male reading10java.lang.reflect.UndeclaredThrowableException at com.sun.proxy.$Proxy0.setInterests(Unknown Source) at com.zs.pattern.proxy.ProxyTest.main(ProxyTest.java:32)Caused by: java.lang.IllegalAccessException: cant't set peronal information at com.zs.pattern.proxy.NonOwnerInvocationHandler.invoke(NonOwnerInvocationHandler.java:24) ... 2 more
阅读全文
0 0
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式--静态代理
- 代理模式!
- 代理模式
- xamarin学习笔记A16(安卓OkHttp3和HttpURLConnection)下
- java习题
- MySQL中给中文进行排序
- final修饰类和方法
- 滚动条
- 代理模式
- 表单
- Java消息中间件学习笔记五 -- ActiveMQ的使用【主题模式】
- 多传感器信息融合笔记
- struts2的核心和工作原理
- 关于Cocos制作翻书效果
- decimal这个数据类型的用法,保证你看懂
- 自写mvc框架,开发小项目
- 【BZOJ4565】【状压DP】【区间DP】[Haoi2016]字符合并 题解