设计模式-代理模式
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));
}
}
浙公网安备 33010602011771号