1.声明
设计模式中的设计思想、图片和部分代码参考自《Head First设计模式》,作者Eric Freeman & Elisabeth Freeman & Kathy Siezza & Bert Bates。
在这里我只是对这本书进行学习阅读,并向大家分享一些心得体会。
2.保护代理简介
Java在java.lang.reflect包中有自己的代理支持,利用这个包你可以在运行时动态地创建一个代理,实现一个或多个接口,并将方法地调用转发到我们所指定地类。因为实际地代理类是在运行时创建的,我们称这个Java技术为:动态代理。
我们要利用Java地动态代理创建我们下一个代理实现(保护代理)。但在这之前,先让我们看一下类图,了解一下动态代理是怎么一回事。就和真实世界中大多数的事物一样,它和代理模式的传统意义有一点出入。
因为Proxy是Java自动帮我们创建的,所以我们需要想办法来告诉Proxy类,我需要做什么。我们不能像以前一样把代码放在Proxy类在,因为Proxy不是我们直接实现的。既然代码不能放在Proxy中,那么应该放在那里?代码需要放在InvocationHandler中。InvocationHandler的工作是响应代理的任何调用。我们可以把InvocationHandler想成是代理受到方法调用后,请求做实际工作的对象。
3.保护代理的使用
3.1需求
某约会网站需要让我们帮他们制作约会后的评分系统。可以为约会对象打分。
3.2初步代码
玩家信息超类-PersonBean:
//用户信息接口
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);
}
玩家信息实现类-PersonBeanImpl:
public class PersonBeanImpl implements PersonBean {
String name;
String gender;
String interests;
//总评分
int rating;
//被评价次数
int ratingCount = 0;
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public String getInterests() {
return interests;
}
//获得平均评分
public int getHotOrNotRating() {
if (ratingCount == 0) return 0;
return (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) {
this.rating +=