代理
在我们写代码的时候,经常会遇到有关能不能访问,并且有时候会出现该方法功能不够的情况,这个时候使用代理无疑是最好的选择,所谓的代理就是原本实现具体功能的类,现在不许访问了,那么我们就需要借助中介类进行访问,而这个中介类就是一个代理类,为这个实际功能的类进行了代理,
(比如:一个明星,在刚出道的时候没有什么人气,这个时候就像我们的代码没有代理一样,但是随着人气的积累,慢慢的业务多了之后,就需要一个经纪人,这个经纪人就是拦截一些外部的信息,只是将这个明星该干什么或者需要的信息传递给明星,其余的都过滤掉,这个时候就是静态代理了,而这个经纪人就是代理类,如果这个经纪人特别厉害,他可以代理多个明星,那么就需要动态代理了,当然也可以一个明星对应一个经纪人,但是这种情况,就需要很多的经纪人去代理,那么如果可以做经纪人的人不多的话就是资源短缺了,我们如果使用动态代理,那么就可以节省资源)
下面就先说下静态代理,在后续的文章中会详细介绍动态代理,因为动态代理才是重点。
静态代理
在静态代理中,我们需要三个东西(一个接口,两个类)
这三者的作用是什么呢?
首先,一个接口进行规范,定义这些类可以实现哪些功能,做一个约束的作用,剩下的两个类,一个是具体实现功能的类,另一个就是代理类,也就是被代理类和代理类,(这两个类都必须实现该接口,因为不管是代理还是被代理,都需要相同的功能,不能因为被代理了功能就变了)
直接上代码:
这是定义的接口类,定义了两个功能
public interface people {
public void eat();
public void sing();
}
student是具体的实现类,实现了两个功能
public class student implements people{
@Override
public void eat() {
System.out.println("学生也是要吃饭的呀");
}
@Override
public void sing() {
}
}
proxyPeople就是代理类,代理类中含有student的引用,这是为了代理其功能
这里有teacher类,先别急,这个类在后边有其作用
public class proxyPeople implements people{
private student stu;
private teacher tea;
public proxyPeople() {
super();
}
public proxyPeople(student stu,teacher tea) {
super();
this.stu=stu;
this.tea=tea;
}
@Override
public void eat() {
System.out.println("做饭开始");
stu.eat();
System.out.println("饭后洗碗");
}
@Override
public void sing() {
tea.sing();
}
public static void main(String[] args) {
student stu=new student();
teacher tea=new teacher();
proxyPeople peo=new proxyPeople(stu,tea);
peo.eat();
peo.sing();
}
}
为了方便就将main方法直接写在了代理类中,我们通过这个方法可以看出,我们原本通过student类的访问现在通过proxyPeople进行访问了,这个student就可以不使用,那么我们不直接访问功能类的需求就做到了,这种方法特别适合我们经常写的那些个事物,因为要开关事物,但是又不能把这个直接写在功能里边,这就需要代理解决,这样一看换真舒服哈,但是,既然有动态代理的出现,那么静态代理必然是有问题的,
这里有teacher类
public class teacher implements people{
@Override
public void eat() {
}
@Override
public void sing() {
System.out.println("老师喜欢唱歌");
}
}
现在综合全部的代码看看,我们就能发现,如果这个代理需要扩展,那就是要修改很多的代码,最主要的是,我们原本的代理应该有专门的作用,就是一个代理类值负责专门的内容,可能就是专业类吧,这时候如果这个接口扩展扩展功能或者有其他的类也需要实现这个接口,那么代理类就需要修改了,或者说是重新建一个代理类,那这样显然并没有节约资源,反而形成冗余,这个时候就是动态代理上场的时候了,我的下一篇博客就是动态代理(jdk的动态代理),需要的可以一步下一篇,大家多交流,谢谢指正。