代理模式/proxy模式/结构型模式

代理模式proxy

定义

为其他对象提供一种代理,并以控制对这个对象的访问。最简单的理解,买东西都是要去商店的,不会去工厂。

java实现三要素 proxy(代理)+subject(接口)+realSubject(实现类)

  1. 定义一个接口
  2. 代理类和实现类均实现1定义的接口
  3. 代理类持有实现类的实例,并在代理类中调用

代码示例

//定义共同的接口
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("代理后....");
	}
} 

优点

  1. 代理模式可以实现对类的扩展,结构型模式,符合OCP原则
  2. 用户权限(根据权限分配资源)、数据库访问(隐藏数据库链接)等
  3. 一定程度上降低了使用者和实现者的耦合关系

缺点

在调用者和实现者之间增加了代理者,造成了额外的系统开销。

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
posted @ 2016-08-24 19:23  toto怎么会喝醉  阅读(367)  评论(2编辑  收藏  举报