一、java遠程代理
1、NonOwnerInvocationHandler
public class NonOwnerInvocationHandler implements InvocationHandler{
PersonBean person;
public NonOwnerInvocationHandler(PersonBean person){
this.person=person;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().startsWith("get")){
return method.invoke(person,args);
}else if(method.getName().equals("setHotOrNotRating")){
return method.invoke(person,args);
}else if(method.getName().startsWith("set")){
return new IllegalAccessException();
}
return null;
}
}
2、OwnerInvocationHandler
public class OwnerInvocationHandler implements InvocationHandler{
PersonBean person;
public OwnerInvocationHandler(PersonBean person)
{
this.person=person;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().startsWith("get")){
return method.invoke(person,args);
}else if(method.getName().equals("setHotOrNotRating")){
return new IllegalAccessException();
}else if(method.getName().startsWith("set")){
return method.invoke(person,args);
}
return null;
}
}
3、代理的使用
public class MatchService {
public MatchService() {
PersonBean joe = getPersonInfo("joe", "male", "running");
PersonBean OwnerProxy = getOwnerProxy(joe);
System.out.println("Name is " + OwnerProxy.getName());
System.out.println("Interests is " + OwnerProxy.getInterests());
OwnerProxy.setInterests("Bowling");
System.out.println("Interests are " + OwnerProxy.getInterests());
OwnerProxy.setHotOrNotRating(50);
System.out.println("Rating is " + OwnerProxy.getHotOrNotRating());
OwnerProxy.setHotOrNotRating(40);
System.out.println("Rating is " + OwnerProxy.getHotOrNotRating());
System.out.println("**************");
PersonBean nonOwnerProxy = getNonOwnerProxy(joe);
System.out.println("Name is " + nonOwnerProxy.getName());
System.out.println("Interests are " + nonOwnerProxy.getInterests());
nonOwnerProxy.setInterests("haha");
System.out.println("Interests are " + nonOwnerProxy.getInterests());
nonOwnerProxy.setHotOrNotRating(60);
System.out.println("Rating is " + nonOwnerProxy.getHotOrNotRating());
}
PersonBean getPersonInfo(String name, String gender, String interests) {
PersonBean person = new PersonBeanImpl();
person.setName(name);
person.setGender(gender);
person.setInterests(interests);
return person;
}
PersonBean getOwnerProxy(PersonBean person) {
return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(),new OwnerInvocationHandler(person));
}
PersonBean getNonOwnerProxy(PersonBean person) {
return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new NonOwnerInvocationHandler(person));
}
}
4、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);
}
5、PersonBeanImpl實現類
public class PersonBeanImpl implements PersonBean{
String name;
String gender;
String interests;
int rating;
int ratingcount=0;
@Override
public String getName() {
return name;
}
@Override
public String getGender() {
return gender;
}
@Override
public String getInterests() {
return interests;
}
@Override
public int getHotOrNotRating() {
if(ratingcount==0) return 0;
return (rating/ratingcount);
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public void setGender(String gender) {
this.gender=gender;
}
@Override
public void setInterests(String interests) {
this.interests=interests;
}
@Override
public void setHotOrNotRating(int rating) {
this.rating=rating;
ratingcount++;
}
}
遠程代理:遠程對象的本地代表,通過它可以讓遠程對象當本地對象來調用。
遠程代理通過網絡和真正的遠程對象溝通信息。
代理模式:爲一個對象提供一個替身,以控制對這個對象的訪問;
被代理的對象:可以是遠程對象、創建開銷大的對象或需要安全控制的對象;
代理模式有很多變體,都是爲了控制與管理對象訪問;
一、虛擬代理
虛擬代理爲創建開銷大的的對象提供代理服務;
真正的對象在創建前和創建中時,由虛擬代理來扮演替身;
二、動態代理
動態代理:運行時動態的創建代理類對象,並將方法調用轉發到指定類
三、保護代理
看一個找對象項目,個人信息,興趣愛好,評分