阅读 238

Proxy pattern-代理模式

解决问题

一方面保证对象本身的行为聚合,避免非对象行为逻辑杂糅到对象行逻辑之中。另一方面,实现对象行为增强,通过代理织入代码,来增强对象的行为功能。

应用场景

主要应用于代码织入。如常用的spring aop

原理图

proxy:代理类

Subject :被代理对象

示例

实现方式主流有三种:静态代理、动态代理、cglib, 原理都是一样的,这里只举一个静态代理的例子

就像我们去买二手房要经过中介一样,房主将房源委托给中介,中介将房源推荐给买方。中间的任何手续的承办都由中介来处理,不需要我们和房主直接打交道。无论对买方还是卖房都都省了很多事情,但同时也要付出代价,对于买房当然是中介费,对于代码的话就是性能。下面我们来介绍实现AOP的三种代理方式。

下面我就以买房的过程中需要打日志为例介绍三种代理方式

静态和动态是由代理产生的时间段来决定的。静态代理产生于代码编译阶段,即一旦代码运行就不可变了。下面我们来看一个例子

public interface IPerson {

public void doSomething();

}

public class Person implements IPerson {

public void doSomething(){

System.out.println("I want wo sell this house");

}

}

public class PersonProxy {

private IPerson iPerson;

private final static Logger logger = LoggerFactory.getLogger(PersonProxy.class);

public PersonProxy(IPerson iPerson) {

this.iPerson = iPerson;

}

public void doSomething() {

logger.info("Before Proxy");

iPerson.doSomething();

logger.info("After Proxy");

}

public static void main(String[] args) {

PersonProxy personProxy = new PersonProxy(new Person());

personProxy.doSomething();

}

}
复制代码

通过代理类我们实现了将日志代码集成到了目标类,但从上面我们可以看出它具有很大的局限性:需要固定的类编写接口(或许还可以接受,毕竟有提倡面向接口编程),需要实现接口的每一个函数(不可接受),同样会造成代码的大量重复,将会使代码更加混乱。

参考

https://en.wikipedia.org/wiki/Proxy_pattern

文章分类
后端
文章标签