(2)保护代理:可以在运行期进行权限检查,核实后将调用传递给被代理的对象。
(3)智能引用代理:在访问一个对象时,执行一些内务处理(Housekeeping)操作,比如计数操作等。
(4)虚拟代理:使用虚拟代理模式的优点是代理对象可以在必要的时候才将被代理的对象加载。延迟加载模式。
保护代理和智能引用代理案例
类图和时序图


代码实现
class Client
{
private static Searcher searcher;
public static void main(String[] args)
{
searcher = new Proxy();
String userId = "Admin";
String searchType = "SEARCH_BY_ACCOUNT";
String result = searcher.doSearch(userId,searchType);
System.out.println(result);
}
}
interface Searcher
{
String doSearch(String userId,String searchType);
}
class Proxy implements Searcher
{
private RealSearcher searcher;
private UsageLogger usageLogger;
private AccessValidator accessValidator;
public Proxy()
{
searcher = new RealSearcher();
}
//查询操作
public String doSearch(String userId,String keyValue)
{
if(checkAccess(userId))
{
String result = searcher.doSearch(null,keyValue);
logUsage(userId);
return result;
} else {
return null;
}
}
//查询前的授权操作
private boolean checkAccess(String userId)
{
accessValidator = new AccessValidator();
return accessValidator.validateUser(userId);
}
//查询后的日志操作
private void logUsage(String userId)
{
UsageLogger logger = new UsageLogger();
logger.setUserId(userId);
logger.save();
}
}
class RealSearcher implements Searcher
{
public RealSearcher() {}
//真实的查询
public String doSearch(String userId,String keyValue)
{
return "真实的查询结果";
}
}
class AccessValidator
{
//用户的权限查询发生在这里
public boolean validateUser(String userId)
{
if(userId.equals("Admin"))
{
return true;
} else {
return false;
}
}
}
class UsageLogger
{
private String userId;
public void setUserId(String userId)
{
this.userId = userId;
}
//记录日志
public void save()
{
//...
}
public void save(String userId)
{
this.userId = userId;
save();
}
}
更多了解
关于代理模式,日常开发过程中的使用场景还是很多的。比如调用WebService,我们总会自动或手动生成客户端的代理类,这是远程代理模式;对于登录,也总可以使用保护代理和智能引用代理。
关于保护代理和智能引用代理,我们过去可能经常把代理主题角色和实际主题角色合并,可以试着按照代理模式的职责进行拆分。
结构模式(Structural Pattern)小结
结构模式(Structural Pattern)一共有七种,分别是:适配器模式、装饰模式、合成模式、代理模式、享元模式、门面模式、桥梁模式。
大致总结如下:
