您的位置:首页 > 编程语言 > Java开发

Java静态代理

2016-03-23 10:19 567 查看
            之前一直不太懂静态代理和动态代理的区别,看drp终于是清晰一些了……
代理模式:它是一种结构型模式,就是给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。代理类和委托类有共同的父接口,这样使用委托类对象的地方都可以使用代理类对象代替。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。 
          


 
            那么是如何划分静态代理和动态代理的呢?是根据代理类生成的时间不同划分的。
 

静态代理

            静态代理就是简单代理模式的一种体现,代理类是在程序运行前就已经存在代理类的字节码文件中,代理类和委托类的关系在运行前就确定了。
          


实现代码:

清单一:代理接口

public interface UserManager {
public void addUser(String userId,String userName);

public void delUser(String userId);
}

清单二:委托类

public class UserManagerImpl implements UserManager {
public void addUser(String userId, String userName) {
try {
System.out.println("UserManagerImpl.addUser() userId-->>"+ userId);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}

public void delUser(String userId) {
System.out.println("UserManagerImpl.delUser() userId-->>"+ userId);
}
}

清单三:代理类

public class UserManagerImplProxy implements UserManager {
private UserManager userManager;

public UserManagerImplProxy(UserManager userManager) {
try {
System.out.println("start-->>addUser() userId-->>" + userId);
userManager.addUser(userId, userName);
System.out.println("success-->>addUser()");
}catch(Exception e) {
e.printStackTrace();
System.out.println("error-->>addUser()");
}
}

public void delUser(String userId) {
try {
System.out.println("start-->>addUser() userId-->>" + userId);
userManager.delUser(userId);
System.out.println("success-->>addUser()");
}catch(Exception e) {
e.printStackTrace();
System.out.println("error-->>addUser()");
}
}
}


清单四:客户类

public class Client {
public static void main(String[] args) {
UserManager userManager=new UserManagerImplProxy(new UserManagerImpl());
userManager.addUser("0001", "张三");
}
}

            其实我们可以看到上面的代理类中,也是有许多的代码是重复的。这时我们想到了AOP,面向切面编程,如果可以横着切一刀可以实现减少重复的代码,那就太好了,动态代理是可以实现的。
 

静态代理的优缺点

            优点:业务类只需要关注业务逻辑本身,保证了业务类的重用行。这是代理的共同优点。
            缺点:代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: