代理模式(重要):
對象結構型模式,使用代理對象來間接訪問被代理對象,爲了用戶使用的透明性,代理對象和被代理對象需要實現相同的接口(以便在任何地方替換被代理類),代理類中包含對被代理類的引用
代理模式的結構:被代理類,代理類,代理類與被代理類要實現的共同抽象接口
代理模式的適用場景:
根據不同的使用情景使用不同的代理類型:
1.保護(權限)代理:控制對被代理類的訪問,對於不同的用戶使用不同的權限
2.遠程代理:在本地提供一個代理對象,這個代理對象負責對遠程服務的調用
3.虛擬代理:對於一個消耗資源較大的對象,先創建一個小對象代理,被代理對象在需要時再創建,將資源消耗大的對象推遲到使用它的時候才創建,可以加快系統的啓動速度
4.動態代理:典型應用Spring AOP。使用動態代理的原因:(1)被代理類必須事先已經存在 (2)一個被代理類需要對應一個或多個代理類,系統中類的個數增多在動態代理中無須關心被代理類是什麼,不需要維護對被代理類的引用,用戶可以根據需要自定義被代理類,系統靈活性和可擴展性更好
代理模式的優點:
1.協調調用者和被調用者,在一定程度上降低了系統的耦合度
2.增加新的代理類,不需要修改原有代碼,符合開閉原則
3.具體看是什麼代理,不同的代理具有不同的優點
代理模式的缺點:
1.增加代理類,可能會使程序運行變慢
2.實現代理需要額外的工作,有些代理的實現較爲複雜
代理模式的例子(保護代理)
User輔助類
public class User {
private String userName;
private int userLevel;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserLevel() {
return userLevel;
}
public void setUserLevel(int userLevel) {
this.userLevel = userLevel;
}
@Override
public String toString() {
return "User [userName=" + userName + ", userLevel=" + userLevel + "]";
}
}
共同接口
public interface AbsUserService {
void add(User user);
void delete(User user);
void modify(User user);
void query(User user);
}
被代理類
public class UserService implements AbsUserService {
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#add(structual.ProxyPattern.User)
*/
@Override
public void add(User user) {
System.out.println("增加用戶:"+user.toString());
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#delete(structual.ProxyPattern.User)
*/
@Override
public void delete(User user) {
System.out.println("刪除用戶:"+user.toString());
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#modify(structual.ProxyPattern.User)
*/
@Override
public void modify(User user) {
System.out.println("修改用戶:"+user.toString());
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#query(structual.ProxyPattern.User)
*/
@Override
public void query(User user) {
System.out.println("查詢用戶:"+user.toString());
}
}
代理類
public class UserServiceProxy implements AbsUserService {
private UserService userService = new UserService();
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#add(structual.ProxyPattern.User)
*/
@Override
public void add(User user) {
userService.add(user);
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#delete(structual.ProxyPattern.User)
*/
@Override
public void delete(User user) {
if (user.getUserLevel() == 0) {
System.out.println("沒有權限刪除用戶:"+user.toString());
}else {
userService.delete(user);
}
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#modify(structual.ProxyPattern.User)
*/
@Override
public void modify(User user) {
if (user.getUserLevel() == 0) {
System.out.println("沒有權限修改用戶:"+user.toString());
}else {
userService.modify(user);
}
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @param user
* @throws
* @return
* @see structual.ProxyPattern.AbsUserService#query(structual.ProxyPattern.User)
*/
@Override
public void query(User user) {
userService.query(user);
}
}
代理模式的應用:
1.Spring的AOP動態代理 2.Web Service