Java静态代理,
分享于 点击 42785 次 点评:138
Java静态代理,
今天在做一个连接池的时候,用到了动态代理,顺便也把静态代理复习下,设计模式经常用关键时刻才能想的起来。
首先来看一下代码的基本结构:
主题类:
public interface Subject {
void doSomeThing();
void init();
void begin();
void after();
void doSomeThingElse();
void sleep();
}
主题类中主要定义的是客户端要调用的一些方法,而且客户端调用的具体类和代理类,都要去实现这个接口。接着是实现主题类的一个具体的实现类:
public class RealSubject implements Subject{
@Override
public void doSomeThing() {
System.out.println("RealSubject_doSomeThing");
}
@Override
public void init() {
System.out.println("RealSubject_init");
}
@Override
public void begin() {
System.out.println("RealSubject_begin");
}
@Override
public void after() {
System.out.println("RealSubject_after");
}
@Override
public void doSomeThingElse() {
System.out.println("RealSubject_doSomeThingElse");
}
@Override
public void sleep() {
System.out.println("RealSubject_sleep");
}
}
我们可以有很多这样的实现类。之后是我们的代理类:
public class Proxy implements Subject{
private Subject subject=new RealSubject();
@Override
public void doSomeThing() {
subject.doSomeThing();
}
@Override
public void init() {
subject.init();
}
@Override
public void begin() {
subject.begin();
}
@Override
public void after() {
subject.after();
}
@Override
public void doSomeThingElse() {
subject.doSomeThingElse();
}
@Override
public void sleep() {
subject.sleep();
}
}
代理类主要是通过在内部定义具体实现类,通过调用代理类的方法,调用具体实现类的方法,还可以添加额外处理。
客户端测试:
public class ClientTest {
public static void main(String[] args) {
Subject subject=new Proxy();
subject.doSomeThing();//there is real subject method
subject.sleep();
subject.doSomeThingElse();
}
}
表面上看,静态代理,就是通过一个第三方的类,去调用我具体实现类的方法。
下面来分析下,静态代理的优缺点。
优点:
代理类使客户端不需要知道实现类是什么,怎么做的,而客户端只需要知道代理类即可。
缺点:
1,代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
2,代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。
相关文章
- 暂无相关文章
用户点评