静态代理与动态代理详解
一、代理概念
Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题。比如,spring aop思想,就是通过代理对相应方法增强,实现代码简化,统一管理等;
代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
按照代理的创建时期,代理类可以分为两种:
- 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
- 动态代理:在程序运行时运用反射机制动态创建而成。(java自身的reflect proxy, 非cglib)
二、静态代理实现方式
一个典型的代理模式通常有三个角色(共同接口、真实对象、代理对象),这里称之为代理三要素。
1、共同接口
public interface Action {
public void doSomething();
}
2、真实对象
public class RealObject implements Action{
public void doSomething() {
System.out.println("realObject do something");
}
}
3、代理对象
// Action 的静态工厂
public class ActionFactory{
public static Action createActionObj(String key){
Action ac = null;
switch(key){
case "real":
ac = new RealObject();
break;
case "..."
...;
}
}
}
public class Proxy implements Action {
private Action realObject;
public Proxy(String key) {
this.realObject = ActionFactoy.createActionObj(key);
}
public void doSomething() {
System.out.println("proxy do something");
realObject.doSomething();
}
}
4、调用运行
Action action = new Proxy("real");
action .doSomething();
// =======result========
// proxy do something
// realObject do something
从上面代码分析看,静态代理的优缺点:
优点:
- 扩展原功能,不侵入原代码。
- 代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合),对于如上的客户端代码,应用工厂将它隐藏。
缺点: 若有多个对象代理,要么编写多个proxy,要么就在一个proxy实现多个代理对象的方法而使自身膨胀 冗余;
三、动态代理实现方式
先上代码:
//做蛋糕的机器
public interface cakeMachine {
void makeCake();
}
//专门做水果蛋糕的机器,并且加上一层杏仁
class FruitCakeMachine implements CakeMachine{
public void makeCake() {
System.out.println("making a Fruit Cake...");