静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.
下面举个案例来解释:
模拟修改动作,定义一个修改动作的接口:IPersonDao.java,然后目标对象实现这个接口的方法PersonDao.java,此时如果使用静态代理方式,就需要在代理对象(PersonDaoProxy.java)中也实现IPersonDao接口.调用的时候通过调用代理对象的方法来调用目标对象.
需要注意的是,代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法
代码示例:
接口:IPersonDao.java
public interface IPersonDao {
void update();
}
目标对象:PersonDao.java
public class PersonDao implements IPersonDao{
public void update() {
// TODO Auto-generated method stub
}
}
代理对象:PersonDaoProxy.java
public class PersonDaoProxy implements IPersonDao{
private IPersonDao target;
public PersonDaoProxy(IPersonDao target){
this.target = target;
}
@Override
public void update() {
}
}
测试类:App.java
public class App {
public static void main(String[] args){
PersonDao p = new PersonDao();
PersonDaoProxy pProxy = new PersonDaoProxy(p);
pProxy.update();
}
}
静态代理总结:
1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
2.缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
如何解决静态代理中的缺点呢?答案是可以使用动态代理方式
领取专属 10元无门槛券
私享最新 技术干货