JAVA 代理模式之通用接口/继承的实现方式
1.它能干什么/ 解决什么问题。
在不动代码的情况下增加额外的处理逻辑,如日志,输出等。
2.代码结构。
一个接口,一个它的实现类再加一个代理类。其中实现类我们称之为目标类。
3.通用接口的实现特点
代理类和目标类实现同一个接口,在代理类中调用目标方法的同时添加额外的逻辑。这样就实现了代理。
4.具体的CODE.
a.通用接口--AnimalOfGeneralInterface
package sample.proxy.generalInterface;
public interface AnimalOfGeneralInterface {
void eat(String food);
String type();
}
b.实现类/目标类/真实的类--MonkeyOfRealClass
package sample.proxy.generalInterface;
public class MonkeyOfRealClass implements AnimalOfGeneralInterface {
@Override
public void eat(String food) {
System.out.println("The food is "+food+" !");
}
@Override
public String type() {
String type ="哺乳动物 ";
System.out.println("type is "+type+" ! ");
return type;
}
}
c.代理类--AnimalWrapperOfProxyClass
package sample.proxy.generalInterface;
public class AnimalWrapperOfProxyClass implements AnimalOfGeneralInterface {
private AnimalOfGeneralInterface animal;
public AnimalWrapperOfProxyClass(AnimalOfGeneralInterface animal){
this.animal = animal;
}
@Override
public void eat(String food) {
System.out.println("---------Wrapper before--------------");
animal.eat(food);
System.out.println("---------Wrapper after--------------");
}
@Override
public String type() {
System.out.println("---------Wrapper before--------------");
String type = animal.type();
System.out.println("---------Wrapper after--------------");
return type;
}
}
d.测试类
package sample.proxy.generalInterface;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
AnimalWrapperOfProxyClass wrapper = new AnimalWrapperOfProxyClass(new MonkeyOfRealClass());
wrapper.eat("桃子");
wrapper.type();
}
}
f.结果,其中Wrapper before,Wrapper after 就是我们在目标前后添加的额外逻辑。
---------Wrapper before--------------
The food is 桃子 !
---------Wrapper after--------------
---------Wrapper before--------------
type is 哺乳动物 !
---------Wrapper after--------------
至于继承模式 稍作修改如下
代理类不在实现统一接口,而是继承目标类。
public class MyAnimalWrapperOfProxyClass extends MonkeyOfRealClass{
这里代码和上面AnimalWrapperOfProxyClass完全一样,其测试代码和结果也完全一样。
}
明显的缺陷不能代理统一接口的所有子类的方法,范围大大的减小,这个实现只作了解吧。