代理模式分为静态和动态代理
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
所以说静态代理,主要是自己写代理子类。比如:
有一个图书接口:
public interface Book{
void read(String name);
}
一个图书实现类:
public class BookImpl implement Book{
@Override
public void read(String name){
System.out.printIn("阅读"+name);
}
}
一个图书代理类:
public class BookProxy implement Book{
private Book bookImpl;
public BookProxy(Book bookImpl){
this.bookImpl = bookImpl;
}
@Override
public void read(String name){
//这里就可以做自己要做的事,比如代理方法之前做什么
bookImpl.read(name);
//代理方法之后做什么
}
}
main方法测试
public class Main{
public static void main(String[] args){
Book bookImpl = new BookImpl();
Book proxy = new BookProxy(bookImpl);
proxy.read("aaa");
}
}
静态代理类优缺点
- 优点:
- 业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
- 缺点:
- 代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
- 如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。