上篇文章中介绍了单例模式的使用,它避免不一致问题,防止状态变化!这篇文章介绍一下代理模式,代理模式为其他对象提供一种代理,以控制对这个对象的访问,它可以在保证不改变原有类的前提下完成对目标类的完善。它是给某一个对象提供一个替代者(占位者),使之在client对象和subject对象之间编码更有效率。代理可以提供延迟实例化(lazy instantiation),控制访问等等,代理模式分为静态代理&动态代理。
静态代理结构图:
UserManager代码段:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public interface UserManager {
public void addUser(String userId,String userName);
public void delUser(String userId);
public void modifyUser(String userId,String userName);
public String findUser(String userId);
}</span>
UserManagerImpl代码段:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserManagerImpl implements UserManager {
@Override
public void addUser(String userId, String userName) {
System.out.println("addUser() userid=" + userId);
}
@Override
public void delUser(String userId) {
System.out.println("delUser() userid=" + userId);
}
@Override
public void modifyUser(String userId, String userName) {
System.out.println("modifyUser() userid=" + userId);
}
@Override
public String findUser(String userId) {
System.out.println("findUser() userid=" + userId);
return null;
}
}</span>
UserManagerImplProxy代码段:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserManagerImplProxy implements UserManager {
private UserManager userManager;
public UserManagerImplProxy(UserManager userManager) {
this.userManager = userManager;
}
@Override
public void addUser(String userId, String userName) {
// System.out.println("UserManagerImplProxy/addUser() userid=" +
// userId);
userManager.addUser(userId, userName);
}
@Override
public void delUser(String userId) {
}
@Override
public void modifyUser(String userId, String userName) {
}
@Override
public String findUser(String userId) {
return null;
}
}</span>
Client代码段:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class Client {
public static void main(String[] args) {
// UserManager userManager = new UserManagerImpl();
UserManager userManager = new UserManagerImplProxy(
new UserManagerImpl());
userManager.addUser("1200", "zhangsan");
}
}</span>
输出结果:
通过代理类的方法调用了目标类中的方法,实现了在不违背“开闭原则”的前提下对目标类的修饰,提高了接口的可维护性!但这样这样对每个接口方法都需要一一修改,尽管提高了接口的可维护性,但带来的工作量却是巨大的,所以这就需要作出优化,动态代理便应用而生,下一篇文章中将详细介绍动态代理的原理以及他们之间的区别。