設計模式之代理模式

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

遠程代理:遠程對象的本地代表,通過它可以讓遠程對象當本地對象來調用。
遠程代理通過網絡和真正的遠程對象溝通信息。
在這裏插入圖片描述

代理模式:爲一個對象提供一個替身,以控制對這個對象的訪問;
被代理的對象:可以是遠程對象、創建開銷大的對象或需要安全控制的對象;
代理模式有很多變體,都是爲了控制與管理對象訪問;

一、虛擬代理

虛擬代理爲創建開銷大的的對象提供代理服務;
真正的對象在創建前和創建中時,由虛擬代理來扮演替身;

二、動態代理

動態代理:運行時動態的創建代理類對象,並將方法調用轉發到指定類

三、保護代理

看一個找對象項目,個人信息,興趣愛好,評分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章