天天看點

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

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

代理模式是java的一種很常用的設計模式,了解代理模式,在我們進行java代碼審計時候是非常有幫助的。

靜态代理

代理,或者稱為 Proxy ,簡單了解就是事情我不用去做,由其他人來替我完成。在黃勇《架構探險》一書中,我覺得很有意思的一句相關介紹是這麼說的:

賺錢方面,我就是我老婆的代理;帶小孩方面,我老婆就是我的代理;家務事方面,沒有代理。

代理類與被代理類都有個共同的特征,就是都實作了相同的接口。代理類調用被代理類的方法。

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

現在我們用一個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();
    }
}
           

執行結果:

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

到這裡假設一個場景,班長作為中間人,幫忙交班費時候,又給老師轉達了一些話,比如成績有所提升...... 這是隻需要修改代理類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();
    }
}
           
JAVA安全基礎之代理模式(一)

到這裡了解了靜态代理模式後,為我們下一章節介紹動态代理打下基礎。

歡迎關注我的公衆号,同步更新喔

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