静态代理与动态代理详解

本文详细介绍了代理模式,包括静态代理和动态代理。静态代理通过手动创建代理类实现,适用于简单场景,但当有多个代理对象时,代码会变得冗余。动态代理则能在运行时动态创建,提供了更大的灵活性。Java动态代理基于反射实现,局限于接口,而CGLib通过字节码技术实现,能代理无接口类。
摘要由CSDN通过智能技术生成

一、代理概念

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...");
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值