上篇文章中介紹了單例模式的使用,它避免不一致問題,防止狀態變化!這篇文章介紹一下代理模式,代理模式爲其他對象提供一種代理,以控制對這個對象的訪問,它可以在保證不改變原有類的前提下完成對目標類的完善。它是給某一個對象提供一個替代者(佔位者),使之在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>
輸出結果:
通過代理類的方法調用了目標類中的方法,實現了在不違背“開閉原則”的前提下對目標類的修飾,提高了接口的可維護性!但這樣這樣對每個接口方法都需要一一修改,儘管提高了接口的可維護性,但帶來的工作量卻是巨大的,所以這就需要作出優化,動態代理便應用而生,下一篇文章中將詳細介紹動態代理的原理以及他們之間的區別。