博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之代理模式
阅读量:4068 次
发布时间:2019-05-25

本文共 4062 字,大约阅读时间需要 13 分钟。

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

远程代理:远程对象的本地代表,通过它可以让远程对象当本地对象来调用。

远程代理通过网络和真正的远程对象沟通信息。
在这里插入图片描述

代理模式:为一个对象提供一个替身,以控制对这个对象的访问;

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

一、虚拟代理

虚拟代理为创建开销大的的对象提供代理服务;

真正的对象在创建前和创建中时,由虚拟代理来扮演替身;

二、动态代理

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

三、保护代理

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

你可能感兴趣的文章
《数据库系统概论》 第二章 关系数据库
查看>>
《数据库系统概论》 第三章 关系数据库标准语言SQL
查看>>
SQL语句(二)查询语句
查看>>
SQL语句(六) 自主存取控制
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
堆排序完整版,含注释
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
PostgreSQL代码分析,查询优化部分,process_duplicate_ors
查看>>
PostgreSQL代码分析,查询优化部分,canonicalize_qual
查看>>
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
查看>>
ORACLE权限管理调研笔记
查看>>
移进规约冲突一例
查看>>
IA32时钟周期的一些内容
查看>>
SM2椭圆曲线公钥密码算法
查看>>
获得github工程中的一个文件夹的方法
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>
PostgreSQL查询优化器详解之逻辑优化篇
查看>>
STM32中assert_param的使用
查看>>
C语言中的 (void*)0 与 (void)0
查看>>