靜態代理的有兩種方式:1.繼承被代理類;2.實現被代理類的接口
方式一:繼承被代理類實現代理模式
類圖如下(畫圖軟件畫的,畫的不好,能看懂就好)
接口代碼如下(Girl.java):
public interface Girl {
boolean date(int money);
}
被代理類(GirlZhang.java):
//實現Girl接口
public class GirlZhang implements Girl {
public boolean date(int money) {
if(money>100000){
System.out.println("可以約會!");
return true;
}
System.out.println("太窮不約會!");
return false;
}
}
代理類(Proxy1.java):
//繼承GirlZhang類,重寫父類方法實現代理
public class Proxy1 extends GirlZhang {
public boolean date(int money) {
doSomethingBefor();
boolean flag = super.date(money);
doSomethingAfter();
return flag;
}
private void doSomethingAfter() {
System.out.println("約會完,代理人幹一些事情");
}
private void doSomethingBefor() {
System.out.println("約會前,代理人準備工作");
}
}
主方法測試(Main.java):
public class Main {
public static void main(String[] args){
Proxy1 proxy1 = new Proxy1();
proxy1.date(1000000);
}
}
這種繼承理類實現的靜態代理,有一個很明顯得缺陷,就是如果要的繼續給被代理類添加拓展的新的功能,就需要繼續繼承上一個代理類,這樣拓展次數過多時,繼承次數就太
多,不利於管理,性能也不好。
方式二:實現被代理類的接口
類圖如下:
接口和被代理類代碼同第一種方式,這裏不再贅述。
代理類(Proxy2.java):
//實現Girl接口
public class Proxy2 implements Girl{
private Girl girl;
public Proxy2(Girl girl){
this.girl=girl;
}
public boolean date(int money) {
doSomethingBefor();
boolean flag = girl.date(money);
doSomethingAfter();
return false;
}
private void doSomethingAfter() {
System.out.println("約會完,代理人幹一些事情");
}
private void doSomethingBefor() {
System.out.println("約會前,代理人準備工作");
}
}
主方法測試(Main.java):
public class Main {
public static void main(String[] args){
Proxy2 proxy2 = new Proxy2(new GirlZhang());
proxy2.date(1000000);
}
}
使用實現接口的方法實現靜態代理,對比使用繼承來實現代理,要好一些,不用多重繼承,但是如果要拓展功能,仍然需要建立許多的實現類,來添加新的功能,這對編碼也帶
了一些不便。所以要更好的處理這些東西,就需要使用動態代理了。
原文地址:http://te-amo.site/user/article/info/ARTICLE20180210042609451