设计模式-代理模式
一、代理模式是什么
一个类可以代表另外一个类的功能,在代理模式中,我们创建具有对象的对象,以便向外界提供功能接口。代理模式有静态代理和动态代理。
二、代理模式的应用场景
比如在生活中,租房子事件也是代理事件,房东把房子交给中介去代理,租客找代理中介既可以租到房子,在这个事件中,中介是代理,租客是使用房东的房子。
所以代理的应用场景有:远程代理,2、虚拟代理 3、保护代理 4、Cache代理 5.同步化代理 6.智能代理 7、Copy on Write代理
三、代理模式的优缺点
优点:
1、职责清晰。2、高扩展性。3、只能化 4、协调调用者和被调用者,降低了系统的耦合度,5、代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用
缺点:
1、由于增加了代理环节,会造成请求的处理速度变慢 2、实现代理模式需要额外的工作,从而增加了系统实现的复杂度。
静态代理的缺点:
当需要代理对象比较多的时候,代理类就会急剧增加了代码的复杂性,是代码不易维护。
动态代理的缺点:
代码不易编写,新手不易看懂。
四、代理模式的原理
代理类代理了实际类的方法,调用类调用代理类就可以实际类的方法
五、代理模式的使用例子
(一)静态代理
1、编写以下的接口和类,Person(接口),PersionImpl(实际的类),PersonProxy(代理类),Demo(调用的类)
1.Person(接口)
//接口
public interface Person {
public String PrintlnName();
}
2.PersionImpl(实际的类)
public class PersionImpl implements Person {
//实际的persion类的方法
public String PrintlnName() {
// TODO Auto-generated method stub
return "name is mengtianxiang";
}
}
3.PersonProxy(代理类)
/**
* 编写代理类
* @author Administrator
*
*/
public class PersonProxy {
PersionImpl persion = new PersionImpl();
//方法
public String PrintlnName(){
return persion.PrintlnName();
}
}
4.Demo(调用的类)
public class Demo {
public static void main(String[] args){
//使用代理类
PersonProxy personProxy =new PersonProxy();
System.out.println(personProxy.PrintlnName());
}
}
(二)动态代理
1、动态代理的原理
动态代理实现的在静态的基础上使用了反射机制去实现的、编写代理类就需要实现反射一个InvocationHandle接口,这个接口有一个方法 Object invoke(Object proxy, Method method, Object[] args),invoke方法参数说明
(1)Object proxy:表示需要代理的对象
(2)Method method, Object[] args:表示操作的方法
(3)Object[] args:method方法所需要插入的参数
2、编写,Person(接口),PersionImpl(实际的类),PersonProxy(代理类),Demo(调用的类)
Person(接口)
//接口
public interface Person {
public String PrintlnName();
}
PersionImpl(实际的类)
public class PersionImpl implements Person {
//实际的persion类的方法
public String PrintlnName() {
// TODO Auto-generated method stub
return "name is mengtianxiang";
}
}
PersonProxy(代理类)
/**
* 编写代理类
* @author Administrator
*
*/
public class PersonProxy implements InvocationHandler {
private Object targetObject=null;
//实现代理类的
public Object getProxy(Object obj){
this.targetObject =obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
//method请求的方法名,args为方法的参数
//invoke是InvocationHandler的方法,返回结果的。
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
//resultObject是请求返回结果
Object resultObject = method.invoke(targetObject, args);
return resultObject;
}
}
Demo(调用的类)
public class Demo {
public static void main(String[] args){
//使用接口接收代理类
Person person =(Person)new PersonProxy().getProxy(new PersionImpl());
System.out.println(person.PrintlnName());
}
}
代理模式的优缺点
代理模式的应用场景