设计模式之代理模式
来源:互联网 发布:文言虚词乎的用法 编辑:程序博客网 时间:2024/06/05 05:56
代理模式
为其他对象提供一种代理以控制对这个对象的访问。
保护代理
只有具有制定权限的人才能执行相应的setter方法。
代理的一些定义
把自己实现的代理模式称为Java的静态代理。把使用Java内建的对代理模式支持的功能来实现的代理称为动态代理。Java的动态代理目前只能代理接口,基本的实现是依靠Java的反射机制和动态生成class的技术。
代码示例
定义订单类接口
package proxy;public interface OrderApi { public void setOderNum(int orderNum,String user); public void setProductName(String productName,String user); public void setOrderUser(String userName,String user);}
订单对象的实现
package proxy;public class Order implements OrderApi{ private int orderNum; private String productName; private String orderUser; public Order(String string, int i, String string2) { this.orderNum = i; this.productName = string; this.orderUser = string2; } public int getOderNum() { return orderNum; } public String getProductName() { return productName; } public String getOderUser() { return orderUser; } @Override public void setOderNum(int orderNum, String user) { // TODO 自动生成的方法存根 this.orderNum = orderNum; } @Override public void setProductName(String productName, String user) { // TODO 自动生成的方法存根 this.productName = productName; } @Override public void setOrderUser(String userName, String user) { // TODO 自动生成的方法存根 this.orderUser = userName; } @Override public String toString()//方便后面的打印 { return "orderNum="+orderNum+",productName="+productName+",orderUser"+orderUser; }}
代理类的实现(使用Java动态代理)
package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class OrderProxy implements InvocationHandler{//这里必须实现InvocationHandler private Order order;//把具体的目标对象和代理对象绑定起来,返回被代理的目标对象的接口 public OrderApi proxyOrder(Order order) { this.order = order; OrderApi newApi = (OrderApi)Proxy.newProxyInstance(order.getClass().getClassLoader(), order.getClass().getInterfaces(), this); return newApi; } @Override public Object invoke(Object proxy, Method method, Object[] arg2) throws Throwable { if (method.getName().startsWith("set")) { if (order.getOderUser() != null && order.getOderUser().equals(arg2[1])) { return method.invoke(order,arg2); } else { System.out.println("您没有权限进行此此操作"); } } else { return method.invoke(order,arg2); } return null; }}
客户端代码:
package proxy;public class Client { public static void main(String[] args) { Order oa = new Order("设计模式",30,"tyb"); OrderProxy proxy = new OrderProxy(); OrderApi proxApi = proxy.proxyOrder(oa); proxApi.setOderNum(1000, "Burning Teng"); System.out.println("Burning Teng修改后"+proxApi.toString()); proxApi.setOderNum(1000, "tyb"); System.out.println("tyb修改后"+proxApi.toString()); }}
运行结果:
您没有权限进行此此操作
Burning Teng修改后orderNum=30,productName=设计模式,orderUsertyb
tyb修改后orderNum=1000,productName=设计模式,orderUsertyb
阅读全文
0 0
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之-代理模式
- 设计模式之 代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之-----代理模式
- 设计模式之代理模式
- 设计模式之-代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- Java语法基础练习题2
- 2017年9月16日21:59:18
- 打印乘法口诀表
- Codeblocks官方主题颜色更换及方法
- Netty源码分析:NioEventLoopGroup
- 设计模式之代理模式
- linux虚拟机上中挂载光驱报错 mount:youmustspecifythefilesystemtype
- 进程与线程的区别与联系
- java反射机制
- C#笔记(8)使应用具有管理员权限
- Lintcode二进制求和
- Python爬虫小记(一)
- 高精度非负数模板
- Java Web 会话保留技术