[关键字]:java,design pattern,设计模式,《Java与模式》学习,Proxy Pattern,代理模式
[环境]:StarUML5.0 + JDK6
[作者]:Winty ([email protected]) http://wintys.blogjava.net
[正文]:
智能引用代理:
SmartProxyTest.java(并不属于pattern.proxy.smart包):
import pattern.proxy.smart.*;
/**
* 智能引用代理:Smart Proxy
*
* 在搜索的时需要进行进行权限认证和使用计数
*
* @version 2009-6-29
* @author Winty(
[email protected])
*/
public class SmartProxyTest{
public static void main(String[] args){
String result;
Searcher searcher;
//未授权访问
searcher = new ProxySearcher("anonymous");
result = searcher.search("abc");
System.out.println("result:" + result);
//授权访问
searcher = new ProxySearcher("admin");
result = searcher.search("xyz");
System.out.println("result:" + result);
}
}
Searcher.java:
package pattern.proxy.smart;
/**
* 搜索
* @version 2009-6-29
* @author Winty(
[email protected]) http://wintys.blogjava.net
*/
public interface Searcher{
/**
* @param value 要搜索的内容
*/
public String search(String value);
}
RealSearcher.java:
package pattern.proxy.smart;
/**
* 实际执行搜索的类。
* 为了避免客户端直接使用,本类没有设置为public
* @version 2009-6-29
* @author Winty(
[email protected]) http://wintys.blogjava.net
*/
class RealSearcher implements Searcher{
@Override
public String search(String value){
//在这里可以根据value到数据库中执行实际搜索,
//此只是示例代码。
String result = "sample result";
return result;
}
}
ProxySearcher.java:
package pattern.proxy.smart;
/**
* 代理搜索
* 将搜索传递给RealSearcher并对调用进行验证和计数
*
* @version 2009-6-29
* @author Winty(
[email protected]) http://wintys.blogjava.net
*/
public class ProxySearcher implements Searcher{
private Searcher searcher;
private String user;
public ProxySearcher(String user){
searcher = new RealSearcher();
this.user = user;
}
@Override
public String search(String value){
if(AccessValidator.validate(user)){
String result = searcher.search(value);
UsageLogger.log(user , value);
return result;
}
return null;
}
}
/**
* 对客户端的访问进行验证
*/
class AccessValidator{
public static boolean validate(String user){
boolean permission = false;
if("admin".equals(user))
permission = true;
return permission;
}
}
/**
* 访问计数
*/
class UsageLogger{
/**
* @param user 用户名
* @param value 搜索的内容
*/
public static void log(String user , String value){
String sql;
sql = "INSERT INTO usage(user , value) values('";
sql += user + "' , '" + value + "')";
//执行SQL: stmt.executeUpdate(sql);
}
}
运行结果:
result:null
result:sample result