【静态代理】

静态代理:程序运行前就已经存在代理类的字节码文件

就是写一个类A,对另一个类B的方法进行增强。
具体的,可以把类B作为类A的成员变量,且B有A的所有方法(实现A或者继承A);
每当调用B的方法时,我们可以调用A的对应方法去完成;在调用A之前,可以对参数进行处理,调用A之后,对返回结果进行处理。

类似于:(A对B的方法进行增强)

public class B {
    public Object method(Object args){
    	//...
    	return null;
    }
}

class A extends B{
    B b;

    public A(B b) {
        this.b = b;
    }

    @Override
    public Object method(Object args) {
        //对参数进行处理
        args = handlerArgs(args);

        Object res = super.method(args);
        
        //对结果进行处理
        res = handlerResult(res);
        
        return res;
    }

    private Object handlerResult(Object res) {
    	//...
        return null;
    }

    private Object handlerArgs(Object args) {
    	//...
        return null;
    }
}

先看一个类:Thread

  • 接口类Runnable:
    在这里插入图片描述
  • Thread 类实现了 Runnable
    在这里插入图片描述
  • 有一个Runnable的成员变量
    在这里插入图片描述
  • 构造函数可以传Runnable
    在这里插入图片描述
  • 实现Runnable的run方法,调用成员变量的run:
    在这里插入图片描述

这是静态代理。


现实现一个简单的静态代理:

  • 有一个做饭的接口
  • 厨师实现做饭接口
  • 现在想要在厨师做饭前后做一些事(相当于对厨师做饭方法做增强)
    • 定义一个饭店接口
    • 在厨师做饭前准备好材料
    • 在厨师做饭后把食品提供给用户

具体代码如下:

public class Tests {
    public static void main(String[] args) {
        Hotel hotel = new Hotel(new Chef());
        hotel.cook();
    }
}

//做饭
interface Cooking {
    void cook();
}

//厨师,只管做饭
class Chef implements Cooking {
    @Override
    public void cook() {
        System.out.println("Chef 正在做饭...");
    }
}

//饭店,准备食材、厨师做饭、提供食品给顾客
class Hotel implements Cooking {
    private Cooking cooking;

	//构造函数传入接口对象
    public Hotel(Cooking cooking) {
        this.cooking = cooking;
    }

    @Override
    public void cook() {
    	//对接口对象方法做增强
        System.out.println("Hotel准备食材");
        
        cooking.cook();
        
        System.out.println("Hotel提供商品给用户");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值