java设计模式9:Proxy(2)

本文通过一个金融网站搜索系统的实例,展示了如何使用代理模式实现用户权限验证和使用情况的日志记录。代理对象不仅提供真实搜索对象的功能,还在调用前后增加了权限检查和使用日志的记录。

一个美国金融网站的真实的例子

此处的代理,包含权限保护和智能引用代理

 

image

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时做两件事,一件是检查权限,对数据进行保护,一种是进行统计,对用户访问次数进行计算。

本章演示了怎样利用代理模式设计一个检查用户权限和记录用户使用次数的子系统。
在实际系统中,用户权限检查要设计到用户是否已经付过使用费用,并且考虑到有些用户是免费邀请来观摩试用的礼宾用户。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值