代理
代理分为静态代理和动态代理,这篇主要介绍静态代理中的:继承和聚合两种方式,是否有其他的方式,本人还不确定,如有错误希望大牛帮忙指正,话不多说。
代理名词
代理对象:增强后的对象
目标对象:被增强的对象
1.继承方式
目标类target,用户DAO 具有的功能是查询功能。
public class UserDaoImpl{
public void query(){
System.out.println("假装数据库查询");
}
}
假如现在需求发生变化,需要查询是记录日志信息,方便日后排查问题。根据单一职责原则,目标类的功能是--查询。记录日志的信息,应该由其他的类实现。怎么办?可以用继承的方式增加一个信息的类,实现日志和查询的两个功能实现。
public class UserDaoLogImpl extends UserDaoImpl{
@Override
public void query(){
System.out.println("---log---");
super.query();
}
}
为了检验这个方法的实现代理的功能,写个测试类,控制台日志信息可以自行验证!这里不截图了。
public class Test{
public static void mian(String[] args){
UserDaoImpl dao = new UserDaoLogImpl();
dao.query();
}
}
如果此时需求继续变化,需要验证查询功能的权限,那么和记录日志的功能实现形同,我们使用的还是继承的方法,增加一个新的类--proxy(代理类)UserDaoPowerImpl继承target(目标类)UserDaoImpl重写query方法。也是可以实现验证权限的查询功能,如果需求继续变化,我们就再需要重新写一个类,缺点就是代理类太多了。
2 聚合方式
被代理的类还是上面的例子的UserDaoImpl,我们继续使用,我们在新增一个借口类UserDao
public interface UserDao {
public void query();
}
UserDaoImpl实现UserDao借口
public class UserDaoImpl implements UserDao{
@Override
public void query(){
System.out.println("假装查询数据库");
}
}
我们的需求还是需要记录日志信息,继续是新增一个类,但是是实现借口UserDao,重写query方法。
public class UserDaolog implements UserDao{
UserDao dao;
public UserDaoLog(UserDao dao){
this.dao = dao;
}
@Override
public void query(){
System.out.println(“Log”);
dao.query;
}
}
验证实现类的功能写个测试类
public class Test{
public static void main(String[] args){
//被代理类target
UserDao target = new UserDaoImpl();
//代理类proxy
UserDao proxy = new UserDaoLog(target);
proxy.query();
}
}
测试类的后台日志信息不截图了,自行验证。跟上面一样需求继续增加的,功能继续增加,代理类的数量也会继续增加。
本文深入探讨静态代理中的继承和聚合方式,通过具体实例说明如何利用这两种方法增强对象功能,如记录日志和权限验证,同时对比分析其优缺点。
306

被折叠的 条评论
为什么被折叠?



