设计模式之代理模式

一、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++;
	}
}

远程代理:远程对象的本地代表,通过它可以让远程对象当本地对象来调用。
远程代理通过网络和真正的远程对象沟通信息。
设计模式之代理模式

代理模式:为一个对象提供一个替身,以控制对这个对象的访问;
被代理的对象:可以是远程对象、创建开销大的对象或需要安全控制的对象;
代理模式有很多变体,都是为了控制与管理对象访问;

一、虚拟代理

虚拟代理为创建开销大的的对象提供代理服务;
真正的对象在创建前和创建中时,由虚拟代理来扮演替身;

二、动态代理

动态代理:运行时动态的创建代理类对象,并将方法调用转发到指定类

三、保护代理

看一个找对象项目,个人信息,兴趣爱好,评分