疑惑?
1.为什么要写这篇文章
2.为什么要使用静态代理以及好处
为什么要写这篇文章
在google百度输入Java代理,会出来各种分析Java代理的文章,尤其是排名靠前的几篇分析的特别透彻,而我还写关于Java代理的文章似乎已经没有意义了,其实,并不是这样的,我觉得开始做任何事,一开始的心态要摆正,不然是不能坚持下去的,写文章最大的好处是让自己慢慢学会自律,在这过程中无论是在技术上还是文笔表达上都会有质的飞跃,对自己的提升是非常有帮助的,因为是刚开始写文章嘛,而且技术还在提升中,可能对某些东西的理解还不能很深入。但总得慢慢来嘛,有一句俗话说的好!“猥琐发育!别浪!” ,对!现在正是发育的时候,少漏点刀,多刷野。当写完这篇文章时,我想我会对Java代理模式的理解会更加深入。
为什么要使用静态代理以及好处
举个过滤自来水的例子,因为自来水本身是比较脏的,我们一般不会直接接自来水喝,但是我们可以通过自来水过滤器来让自来水变成能喝的水。下面是这个例子的代码实现。
定义一个公共接口,作用嘛!有一大堆理论,什么面向抽象编程啦!面向接口编程啦!依赖倒转原则啊,两个类尽量别产生直接关系,通过第三方抽象产生依赖~~~ 这些东西需要有一定代码量,自然而然的就能明白,到那时你就会感觉使用接口有种预知未来的感觉,对于初学者不用着急着理解接口的含义,不理解先放放,没事。
interface Water{
void getWater();
}
定义一个自来水类(也就是委托类(也就是被代理的类))实现Water接口中getWater()方法,那么就代表这个类有了获取水的能力,但是这个水是没有处理过的,不能直接饮用。
public class TapWater implements Water{
public void createWater(){
System.out.println("自来水有点脏!");
}
}
定义一个过滤自来水的类TapWaterFilter(也就是代理类)也是实现Water中getWater()方法,同样也有获取水的能力,只是这个水是经过处理的水可以直接饮用。
public class TapWaterFilter implements Water{
private Water mWater;
TapWaterFilter(Water water){
this.mWater = water;
}
public void getWater(){
System.out.println("去超市买明矾,半透膜...");
mWater.createWater();
System.out.println("通过半透膜法、沉淀法、吸附法过滤,自来水变纯净水...");
}
}
客户端的使用如下:
public static void main(String[] args){
TapWater tapWater = new TapWater();
TapWaterFilter tapWaterFilter = new TapWaterFilter(tapWater);
tapWaterFilter.createWater();
}
因为例子比较简单,可能有人会说干嘛这么麻烦,直接改自来水类不来得更实在嘛,干啥还要定义一个TapWaterFilter类拐弯抹角的过滤自来水。
static class TapWater implements Water{
public void createWater(){
System.out.println("去超市买明矾,半透膜...");
System.out.println("自来水有点脏!");
System.out.println("通过半透膜法、沉淀法、吸附法过滤,自来水变纯净水...");
}
}
像上面这么改,直接改自来水类中的getWater()方法,不使用TabWaterFilter处理自来水,从设计模式元则上来分析缺点有
1.破坏了单一职责元则
我在写代码的时候,当发现自己写的函数特别臃肿,复用性差,查看整个类,发现好多地方都是重复代码时,我会考虑去重构某些函数,首先就会去考虑这个函数是否越职能了,它是否完成多项功能,这样的话,就有必要把这个多余的功能单独抽出来写一个函数,像上面的例子直接改自来水类(TapWater)中的getWater()方法,也就直接让getWater负责多项职能了,但是你可能会说过滤自来水(TapWaterFilter)类不就是处理多项职能了吗,但是别忘了,这个类是TapWater的代理类,起到方法增强的功能,为了不破坏TapWater中getWater单一职责元则,我们才这样设计TapWaterFilter中的getWater,并且他的核心职能也只有一个,那就是造出纯净水,只有这样,当我们还需使用自来水浇花时我们会庆幸当初没有让TapWater中的getWater造出纯净水来,而是使用代理类来完成这项职能。
2.违背了开闭元则
开闭元则是这样定义的,对扩展开放,对修改关闭,相当抽象,但是这两句话高度概括了设计模式的目的,我们之所以使用设计模式,无非就是设计一个可轻易扩展,让模块与模块之间可使用组装式的方式来产生联系。
代理模式正是遵循了这一元则,它并未产生对原来代码的修改,客户端的代码是原封未动的,并且它扩展了原来代码的功能。