设计模式之代理模式

来源:互联网 发布:文言虚词乎的用法 编辑:程序博客网 时间: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

原创粉丝点击