代理模式

来源:互联网 发布:基因毒性杂质数据库 编辑:程序博客网 时间: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
原创粉丝点击