[关键字]:java,design pattern,设计模式,《Java与模式》学习,Proxy Pattern,代理模式
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com) http://wintys.blogjava.net
[正文]:
智能引用代理:
SmartProxyTest.java(并不属于pattern.proxy.smart包):
import pattern.proxy.smart.*;
/**
* 智能引用代理:Smart Proxy
*
* 在搜索的时需要进行进行权限认证和使用计数
*
* @version 2009-6-29
* @author Winty(wintys@gmail.com)
*/
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(wintys@gmail.com) 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(wintys@gmail.com) 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(wintys@gmail.com) 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
- 大小: 58.6 KB
分享到:
相关推荐
代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象控制对原对象的访问。在Java中,代理模式主要有静态代理和动态代理两种实现方式。 1. 静态代理:在编译时就已经确定了代理类与目标类的...
8. **智能引用代理**:在对象被引用时执行附加操作,例如计数引用次数或执行清理任务。 代理模式的使用可以使系统更加灵活,能够添加新的功能或控制,同时保持原有对象的简洁性。在软件设计中,尤其是在大型系统中...
5. **智能引用代理**:除了保持对目标对象的引用,还可以提供一些额外的信息,如引用计数。 在实际应用中,苹果的UIKit框架广泛使用了代理模式,如UITableViewDataSource和UITableViewDelegate,以及UIWebView的...
4. 智能引用代理:可以添加一些额外的操作,比如引用计数、对象访问计数、对象创建日志记录等。 代理模式的适用场景包括: - 当客户不想或者不适合直接引用一个对象,或是访问一个对象存在困难时,可以使用代理模式...
代理模式的核心思想是为一个对象提供一个代理,这个代理对象作为原对象的替代品,可以控制对原对象的访问,或者在调用原对象的基础上增加额外的功能。代理可以在客户端和目标对象之间起到中介的作用,它可以实现如...
在你提供的代码中,“代理模式”的实现可能是通过创建一个代理类,这个代理类持有对真实对象的引用,并处理与真实对象相关的请求。代理类可以添加额外的逻辑,比如验证、日志记录或缓存策略。代理类通常具有与真实...
- **智能引用**:提供额外的信息,如对象的状态,或者在访问对象时执行特定的操作。 4. **Java中实现代理模式** 在Java中,我们可以利用接口来实现静态代理。首先定义一个接口,然后让目标对象和代理对象都实现这...
- **智能引用(Smart Reference)**: 除了保持对真实对象的引用外,还提供额外的管理功能,如计数引用次数,以便在没有引用时自动删除对象。 ### 3. 代理模式的优点 1. **控制访问**: 代理可以控制对真实对象的访问...
- **智能引用**:除了保持对目标对象的引用外,还提供一些附加操作,如计数、缓存等。 代理模式的优点: - **扩展性**:可以在不修改原有代码的情况下,通过代理类添加新的功能。 - **解耦**:代理对象可以隔离...
代理模式是一种设计模式,它是结构型模式的一种,主要用于在对象之间提供一个代理以控制对原对象的访问。在这个实例中,我们看到的是如何通过代理模式来实现某种功能的增强或控制。下面将详细讲解代理模式的基本概念...
- **智能引用**:在Java中,代理对象可以用来实现弱引用或软引用,避免内存泄漏。 代理模式有多种实现方式,包括静态代理和动态代理。静态代理是在编译时就确定了代理关系,而动态代理则可以在运行时动态生成代理类...
5. **智能引用代理**:当真实对象的生命周期依赖于代理时,可以使用智能引用代理。智能引用代理可以跟踪真实对象的状态,并确保当不再需要时,真实对象被正确地销毁。 #### 四、代理模式的优点 - **增强功能**:...
4. **智能引用**:在C++中,智能指针(如`std::shared_ptr`、`std::unique_ptr`)就是一种代理,它们提供了对原始指针的封装,增加了垃圾回收等功能。 在C++实现代理模式时,通常会涉及到以下关键组件: - **...
- **智能引用**:代理对象可以提供额外的信息或服务,比如统计对象的使用次数。 在`AdapterPattern`这个文件中,虽然名字提及的是适配器模式,但它可能是误传或者包含了关于代理模式的示例。适配器模式是一种结构型...
4. 智能引用:代理对象可以增加额外的统计、跟踪等信息,而不影响原始对象的使用。 在代理模式中,通常有三个关键角色: 1. 目标对象(RealSubject):代理模式所要控制的对象,实现了与客户端相同的接口,是代理...
代理模式的核心思想是为一个对象提供一个代理,使得代理对象可以在不改变原有对象行为的前提下,增加额外的功能或者控制原对象的访问。这种模式可以用于延迟加载、安全控制、统计分析等多种场景。 在代理模式中,有...
- **智能引用代理**:提供额外的逻辑,比如增加引用计数,防止对象过早释放。 3. **在iOS中的应用**: - **UITableView/UICollectionView的数据源代理**:负责填充表格或集合视图的数据,如`...
代理模式属于结构型设计模式,它创建了一个代理对象来控制对原对象的访问。代理对象与目标对象具有相同的接口,这样客户端就可以透明地调用代理对象,而无需知道目标对象的细节。代理对象可以添加额外的操作,如...
代理模式是一种设计模式,它在软件工程中扮演着重要的角色,允许我们为其他对象提供一个替代接口,以控制对原对象的访问。这种模式的主要目的是为了增加灵活性、安全性或者为对象提供额外的功能,同时保持客户端代码...
4. 智能引用:代理对象除了提供对目标对象的引用外,还可以记录目标对象的使用情况,如计数器等。 总的来说,代理模式是一种强大的设计模式,它可以在不修改原有对象的情况下,为对象添加新的功能,提高系统的灵活...