设计模式-代理模式

1.基础代理模式

定义:为其他对象提供一种代理以控制对这个对象的访问。

类图示例:

 

ProxyComputer和RealComputer都实现Computer接口,RealComputer是真正实现电脑功能的类,ProxyComputer作为RealComputer的代理,和RealComputer拥有一样的接口,并且负责RealComputer对象的创建和销毁。

 

2.动态代理模式

JAVA 在java.lang.reflect类库提供对动态模式的支持。

类图示例:

代码示例:

public interface PersonBean {

    

    String getName();

    String getGender();

    String getInterests();

    int getHotOrRating();

    

    void setName(String name);

    void setGender(String gender);

    void setInterests(String interest);

    void setHotOrNotRating(int rating);

}

 

public class PersonBeanImpl implements PersonBean{

 

    private String mName;

    private String mGender;

    private String mInterests;

    private int mRating = 0;

    int mRatingCount = 0;

    @Override

    public String getName() {

        // TODO Auto-generated method stub

        return mName;

    }

 

    @Override

    public String getGender() {

        // TODO Auto-generated method stub

        return mGender;

    }

 

    @Override

    public String getInterests() {

        // TODO Auto-generated method stub

        return mInterests;

    }

    

    @Override

    public int getHotOrRating() {

        // TODO Auto-generated method stub

        return mRatingCount == 0 ? 0 : (mRating / mRatingCount);

    }

 

    @Override

    public void setName(String name) {

        // TODO Auto-generated method stub

        mName = name;

    }

 

    @Override

    public void setGender(String gender) {

        // TODO Auto-generated method stub

        mGender = gender;

    }

 

    @Override

    public void setInterests(String interest) {

        // TODO Auto-generated method stub

        mInterests = interest;

    }

 

    @Override

    public void setHotOrNotRating(int rating) {

        // TODO Auto-generated method stub

        mRating = rating;

        mRatingCount++;

    }

 

}

 

public class OwnerInvocationHandler implements InvocationHandler {

 

    PersonBean mBean;

 

    public OwnerInvocationHandler(PersonBean bean) {

        mBean = bean;

    }

 

    @Override

    public Object invoke(Object proxy, Method method, Object[] args)

            throws IllegalAccessException {

        // TODO Auto-generated method stub

        try {

            if (method.getName().startsWith("get")) {

                return method.invoke(mBean, args);

            } else if (method.getName().equals("setHotOrNotRating")) {

                throw new IllegalAccessException();

            } else if (method.getName().startsWith("set")) {

                return method.invoke(mBean, args);

            }

        } catch (InvocationTargetException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return null;

    }

 

}

 

public class PersonClient {

 

    public static void main(String[] args) {

 

        PersonBean bean = new PersonBeanImpl();

 

        PersonBean owen = getOwenPerson(bean);

 

        PersonBean noOwer = getNoOwenPerson(bean);

 

        owen.setGender("");

        owen.setName("王二");

        owen.setInterests("打篮球");

        //owen.setHotOrNotRating(9);

 

        noOwer.setGender("");

        noOwer.setName("王二");

        noOwer.setInterests("打篮球");

        noOwer.setHotOrNotRating(9);

 

        System.out.println("owen : " + owen.getName() + "/" + owen.getGender()

                + "/" + owen.getInterests() + "/" + owen.getHotOrRating());

        

        System.out.println("noOwer : " + noOwer.getName() + "/" + noOwer.getGender()

                + "/" + noOwer.getInterests() + "/" + noOwer.getHotOrRating());

    }

 

    public static PersonBean getOwenPerson(PersonBean bean) {

        return (PersonBean) Proxy.newProxyInstance(bean.getClass()

                .getClassLoader(), bean.getClass().getInterfaces(),

                new OwnerInvocationHandler(bean));

    }

 

    public static PersonBean getNoOwenPerson(PersonBean bean) {

        return (PersonBean) Proxy.newProxyInstance(bean.getClass()

                .getClassLoader(), bean.getClass().getInterfaces(),

                new NoOwerInvocationHandler(bean));

    }

}

 

posted on 2015-04-01 10:19  jaden.xu  阅读(123)  评论(0)    收藏  举报

导航