为什么要学代理模式?因为这就是SpringAop的底层 【SpringAop 和 SpringMVC面试必问 ???还未学】
代理模式的分类:
- 静态代理
- 当有新的需求时,尽量不改变底层代码,为要改变的类增加一个代理类,它实现要改变的类的所有功能并在它的基础上增加新的功能,通过组合或者继承实现。
静态代理例子:
Rent接口
public interface Rent {
void rent();
}
Host房东实现Rent接口
public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东要出租房子");
}
}
房东(Host)只有一个功能,就是租房子。其他的事情房东一律不管,比如说找租客,邀请租客看房子等任务都交个中介(代理)来完成。 这使得房东的功能更加的纯粹、单一。 想要拓展功能则直接在Proxy类中增加即可。
public class Proxy {
private Host host;
public Proxy(Host host){
this.host = host;
}
public void rent(){
System.out.println("中介卖房子啦");
host.rent();
}
public void visit(){
System.out.println("参观房子");
}
}
Main
public class MyTest {
public static void main(String[] args) {
Proxy proxy = new Proxy(new Host());
proxy.visit();
proxy.rent();
}
}
讲完静态代理再来提一下设计模式的开-闭原则
开-闭”原则,即“对扩展开放,对修改关闭”。继续拿租房子的例子来说。当我们需要增加Proxy的功能时候,比如说要使得rent()方法中增加一句代码:
public void rent(){
System.out.println("中介卖房子啦");
host.rent();
System.out.println("租房成功,获得提成");
}
所谓修改关闭就是指不要修改Proxy类中的任何代码,想要增加功能就自己扩展一个类来实现这个功能。
Rent_Proxy2
public class Rent_Proxy2 {
public Proxy proxy;
public Rent_Proxy2 (Proxy proxy){
this.proxy = this.proxy; //获得proxy对象
}
public void rent(){
proxy.rent();
System.out.println("租房成功,获得提成");
}
public void visit(){
proxy.visit();
}
}
开闭原则虽然导致代码量大大增加,但是如果随意修改底层的代码是一个很危险的事情,可能造成其他业务崩溃。开闭原则降低了系统的耦合性。
通过静态代理模式会大大增加代码量,而通过动态代理模式(反射)则可以避免这个问题。