一个美国金融网站的真实的例子
此处的代理,包含权限保护和智能引用代理
package com.javapatterns.proxy.smartproxy;
public class Client
{
private static Searcher searcher;
public static void main(String[] args)
{
searcher = new Proxy();
String userId = "Admin";
String searchType = "SEARCH_BY_ACCOUNT_NUMBER";
String result = searcher.doSearch(userId, searchType);
System.out.println(result);
}
}
package com.javapatterns.proxy.smartproxy;
public interface Searcher
{
String doSearch(String userId, String searchType);
}
package com.javapatterns.proxy.smartproxy;
class RealSearcher implements Searcher
{
public RealSearcher()
{
}
public String doSearch(String userId, String keyValue)
{
String sql = "SELECT * FROM data_table WHERE key_col = '" + keyValue + "'";
//execute this SQL Statement and concatenate a result string
return "result set";
}
}
package com.javapatterns.proxy.smartproxy;
public 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.vaidateUser(userId);
}
private void logUsage(String userId)
{
UsageLogger logger = new UsageLogger();
logger.setUserId(userId);
logger.save();
}
}
package com.javapatterns.proxy.smartproxy;
public class AccessValidator
{
public boolean vaidateUser(String userId)
{
if (userId.equals("Admin"))
{
return true;
}
else
{
return false;
}
}
}
package com.javapatterns.proxy.smartproxy;
public class UsageLogger
{
public void setUserId(String userId)
{
this.userId = userId;
}
public void save()
{
String sql = "INSERT INTO USAGE_TABLE (user_id) " +
" VALUES(" + userId + ")";
//execute this SQL statement
}
public void save(String userId)
{
this.userId = userId;
save();
}
private String userId;
}
此代理,在调用RealSearcher时做两件事,一件是检查权限,对数据进行保护,一种是进行统计,对用户访问次数进行计算。
本章演示了怎样利用代理模式设计一个检查用户权限和记录用户使用次数的子系统。
在实际系统中,用户权限检查要设计到用户是否已经付过使用费用,并且考虑到有些用户是免费邀请来观摩试用的礼宾用户。