代理模式/proxy模式/结构型模式
代理模式proxy
定义
为其他对象提供一种代理,并以控制对这个对象的访问。最简单的理解,买东西都是要去商店的,不会去工厂。
java实现三要素 proxy(代理)+subject(接口)+realSubject(实现类)
- 定义一个接口
- 代理类和实现类均实现1定义的接口
- 代理类持有实现类的实例,并在代理类中调用
代码示例
//定义共同的接口
interface Sourceable{
void method();
}
//具体实现类
class Source implements Sourceable {
@Override
public void method() {
System.out.println("执行方法");
}
}
//代理类(持有实现类实例)
class SourceProxy implements Sourceable{
Sourceable sourceable;
public SourceProxy(){
super();
sourceable=new Source();
}
@Override
public void method() {
System.out.println("代理前....");
sourceable.method();
System.out.println("代理后....");
}
}
优点
- 代理模式可以实现对类的扩展,结构型模式,符合OCP原则
- 用户权限(根据权限分配资源)、数据库访问(隐藏数据库链接)等
- 一定程度上降低了使用者和实现者的耦合关系
缺点
在调用者和实现者之间增加了代理者,造成了额外的系统开销。
JDK中的代理模式
java.lang.reflect.Proxy,反射包中的代理类,Proxy类提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
创建某一接口 Foo 的代理可以简单的调用:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler);
//JDK源码中newProxyInstance方法的声明
/**
* Returns an instance of a proxy class for the specified interfaces
* that dispatches method invocations to the specified invocation
* handler.
**/
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
I am a slow walker, but I never walk backwards.