JAVA安全基礎之代理模式(一)
代理模式是java的一種很常用的設計模式,了解代理模式,在我們進行java代碼審計時候是非常有幫助的。
靜态代理
代理,或者稱為 Proxy ,簡單了解就是事情我不用去做,由其他人來替我完成。在黃勇《架構探險》一書中,我覺得很有意思的一句相關介紹是這麼說的:
賺錢方面,我就是我老婆的代理;帶小孩方面,我老婆就是我的代理;家務事方面,沒有代理。
代理類與被代理類都有個共同的特征,就是都實作了相同的接口。代理類調用被代理類的方法。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5EDO0EjM1cTM0IjNwEjMwITLldWYtl2LcdWbp9CXyVGdzFWbvw1dhJ3LcdWbp9CXp5WdolXevwVbvNmLlVGdpd2Lc9CX6MHc0RHaiojIsJye.png)
現在我們用一個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();
}
}
執行結果:
到這裡假設一個場景,班長作為中間人,幫忙交班費時候,又給老師轉達了一些話,比如成績有所提升...... 這是隻需要修改代理類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();
}
}
到這裡了解了靜态代理模式後,為我們下一章節介紹動态代理打下基礎。
歡迎關注我的公衆号,同步更新喔