Loading

JAVA安全基础之代理模式(一)

JAVA安全基础之代理模式(一)

代理模式是java的一种很常用的设计模式,理解代理模式,在我们进行java代码审计时候是非常有帮助的。

静态代理

代理,或者称为 Proxy ,简单理解就是事情我不用去做,由其他人来替我完成。在黄勇《架构探险》一书中,我觉得很有意思的一句相关介绍是这么说的:

赚钱方面,我就是我老婆的代理;带小孩方面,我老婆就是我的代理;家务事方面,没有代理。

代理类与被代理类都有个共同的特征,就是都实现了相同的接口。代理类调用被代理类的方法。

image-20210624175214819

现在我们用一个demon来举例代理模式,假如一个班的同学要向老师交班费,但是都是通过班长把班费转交给老师。这里,班长就是代理学生上交班费。

1.(接口)创建Person接口:

public interface Person {
    //上交班费
    void giveMoney();
}

2.(被代理类)Student类实现了Person接口。Student可以具体实施上交班费的动作。

public class Student implements Person{
    private String name;

    public Student(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

    @Override
    public void giveMoney() {
        System.out.println(name + "上交了班费");
    }
}

3.(代理类)创建班长类StudentProxy,这个类也实现了Person接口,还另外持有一个Student类对象。他可以帮Student类执行giveMoney()方法

public class StudentProxy implements Person{
    //被代理的学生
    Student student;

    //传入被代理的对象
    public StudentProxy(Student student) {
        this.student = student;
    }

    //代理上交班费,调用被代理学生的上交班费行为
    @Override
    public void giveMoney() {
        student.giveMoney();
    }
}

使用代理模式:

public class ProxyTest {
    public static void main(String[] args) {
        //创建被代理类,xiaoming同学
        Student xiaoming = new Student("xiaoming");
        //创建代理类,把xiaoming同学传给代理类StudentProxy班长
        StudentProxy banzhang = new StudentProxy(xiaoming);
        //用代理类执行被代理类的方法
        banzhang.giveMoney();
    }
}

执行结果:

image-20210624161007701

到这里假设一个场景,班长作为中间人,帮忙交班费时候,又给老师转达了一些话,比如成绩有所提升...... 这是只需要修改代理类StudentProxy就可以做到。

新建一个talk方法,放入giveMoney中调用

public class StudentProxy implements Person{
    //被代理的学生
    Student student;


    //传入被代理的对象
    public StudentProxy(Student student) {
        this.student = student;
    }

	//学习有进步
    private void talk(Student student){
        System.out.println(student.getName() + "最近学习有进步");
    }

    //代理上交班费,调用被代理学生的上交班费行为
    @Override
    public void giveMoney() {
        talk(student);
        student.giveMoney();
    }
}

执行结果:

image-20210624173234171

到这里理解了静态代理模式后,为我们下一章节介绍动态代理打下基础。

欢迎关注我的公众号,同步更新喔

wx

posted @ 2021-06-24 18:09  Atomovo  阅读(101)  评论(0编辑  收藏  举报