静态代理的有两种方式: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