代理模式:访问控制的终极守护
代理模式:访问控制的守护大师
代理模式(Proxy Pattern)是一种结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式的核心思想是通过引入一个中间层(代理对象)来间接访问目标对象,从而实现对目标对象的保护、延迟加载、日志记录等功能。
代理模式的核心角色
代理模式通常涉及三个核心角色:
- 抽象主题(Subject):定义目标对象和代理对象的公共接口,使得代理对象可以替代目标对象被使用。
- 真实主题(Real Subject):真正执行业务逻辑的对象,代理对象最终会调用它的方法。
- 代理(Proxy):持有对真实主题的引用,并在调用真实主题方法前后执行额外的逻辑,如权限检查、缓存、日志等。
代理模式的常见类型
代理模式根据应用场景的不同,可以分为以下几种类型:
- 远程代理(Remote Proxy):用于在不同的地址空间(如远程服务器)访问对象,隐藏网络通信细节。
- 虚拟代理(Virtual Proxy):延迟创建开销较大的对象,直到真正需要时才实例化(如大图加载)。
- 保护代理(Protection Proxy):控制对敏感对象的访问,检查调用者权限。
- 智能引用代理(Smart Reference Proxy):在访问对象时执行额外操作,如引用计数、线程安全检查等。
代理模式的实现示例
以下是一个简单的保护代理示例,用于控制对敏感数据的访问:
// 抽象主题
interface DatabaseAccess {
void query(String sql);
}
// 真实主题
class RealDatabaseAccess implements DatabaseAccess {
@Override
public void query(String sql) {
System.out.println("Executing query: " + sql);
}
}
// 代理
class DatabaseAccessProxy implements DatabaseAccess {
private RealDatabaseAccess realDatabaseAccess;
private String userRole;
public DatabaseAccessProxy(String userRole) {
this.userRole = userRole;
}
@Override
public void query(String sql) {
if ("admin".equals(userRole)) {
if (realDatabaseAccess == null) {
realDatabaseAccess = new RealDatabaseAccess();
}
realDatabaseAccess.query(sql);
} else {
System.out.println("Access denied: Only admin can execute queries.");
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
DatabaseAccess adminAccess = new DatabaseAccessProxy("admin");
adminAccess.query("SELECT * FROM users"); // 允许执行
DatabaseAccess userAccess = new DatabaseAccessProxy("user");
userAccess.query("DELETE FROM users"); // 拒绝访问
}
}
代理模式的优势与适用场景
代理模式的主要优势包括:
- 控制访问:通过代理限制对真实对象的直接访问,增强安全性。
- 增强功能:在不修改真实对象的情况下,扩展其行为(如日志、缓存)。
- 延迟加载:对于资源密集型对象,代理可以推迟其创建和初始化。
适用场景包括:
- 需要对对象的访问进行权限控制时(如保护代理)。
- 需要为远程对象提供本地代表时(如远程代理)。
- 需要优化系统性能,延迟加载大对象时(如虚拟代理)。
代理模式与装饰器模式的区别
代理模式和装饰器模式(Decorator Pattern)在结构上相似,但目的不同:
- 代理模式:控制对对象的访问,通常代理类和目标类的关系在编译时确定。
- 装饰器模式:动态地为对象添加功能,装饰器可以在运行时递归叠加。
代理模式更注重访问控制,而装饰器模式更注重功能扩展。
总结
代理模式通过引入代理对象,实现对目标对象的间接访问,从而提供访问控制、延迟加载、日志记录等功能。它是系统设计中常用的模式之一,尤其在需要保护或增强对象行为时非常有用。理解代理模式的核心思想和实现方式,能够帮助开发者更好地设计灵活、安全的系统架构。
BbS.okacop071.info/PoSt/1120_244213.HtM
BbS.okacop072.info/PoSt/1120_116284.HtM
BbS.okacop073.info/PoSt/1120_192574.HtM
BbS.okacop074.info/PoSt/1120_701130.HtM
BbS.okacop075.info/PoSt/1120_306336.HtM
BbS.okacop076.info/PoSt/1120_748420.HtM
BbS.okacop077.info/PoSt/1120_346582.HtM
BbS.okacop078.info/PoSt/1120_962284.HtM
BbS.okacop079.info/PoSt/1120_755868.HtM
BbS.okacop080.info/PoSt/1120_718995.HtM
BbS.okacop081.info/PoSt/1120_233610.HtM
BbS.okacop082.info/PoSt/1120_473280.HtM
BbS.okacop083.info/PoSt/1120_982677.HtM
BbS.okacop084.info/PoSt/1120_332569.HtM
BbS.okacop085.info/PoSt/1120_871135.HtM
BbS.okacop086.info/PoSt/1120_611519.HtM
BbS.okacop087.info/PoSt/1120_519956.HtM
BbS.okacop088.info/PoSt/1120_650973.HtM
BbS.okacop090.info/PoSt/1120_010273.HtM
BbS.okacop091.info/PoSt/1120_335191.HtM
BbS.okacop081.info/PoSt/1120_160163.HtM
BbS.okacop082.info/PoSt/1120_193251.HtM
BbS.okacop083.info/PoSt/1120_403463.HtM
BbS.okacop084.info/PoSt/1120_475653.HtM
BbS.okacop085.info/PoSt/1120_677417.HtM
BbS.okacop086.info/PoSt/1120_254181.HtM
BbS.okacop087.info/PoSt/1120_016894.HtM
BbS.okacop088.info/PoSt/1120_787843.HtM
BbS.okacop090.info/PoSt/1120_022199.HtM
BbS.okacop091.info/PoSt/1120_921847.HtM
BbS.okacop081.info/PoSt/1120_481326.HtM
BbS.okacop082.info/PoSt/1120_931524.HtM
BbS.okacop083.info/PoSt/1120_326636.HtM
BbS.okacop084.info/PoSt/1120_127585.HtM
BbS.okacop085.info/PoSt/1120_643905.HtM
BbS.okacop086.info/PoSt/1120_768988.HtM
BbS.okacop087.info/PoSt/1120_533392.HtM
BbS.okacop088.info/PoSt/1120_714720.HtM
BbS.okacop090.info/PoSt/1120_332234.HtM
BbS.okacop091.info/PoSt/1120_280091.HtM
BbS.okacop081.info/PoSt/1120_672118.HtM
BbS.okacop082.info/PoSt/1120_018283.HtM
BbS.okacop083.info/PoSt/1120_751408.HtM
BbS.okacop084.info/PoSt/1120_568269.HtM
BbS.okacop085.info/PoSt/1120_009281.HtM
BbS.okacop086.info/PoSt/1120_830180.HtM
BbS.okacop087.info/PoSt/1120_378641.HtM
BbS.okacop088.info/PoSt/1120_915219.HtM
BbS.okacop090.info/PoSt/1120_878072.HtM
BbS.okacop091.info/PoSt/1120_036948.HtM
BbS.okacop081.info/PoSt/1120_809536.HtM
BbS.okacop082.info/PoSt/1120_639720.HtM
BbS.okacop083.info/PoSt/1120_539751.HtM
BbS.okacop084.info/PoSt/1120_196162.HtM
BbS.okacop085.info/PoSt/1120_361949.HtM
BbS.okacop086.info/PoSt/1120_963444.HtM
BbS.okacop087.info/PoSt/1120_754460.HtM
BbS.okacop088.info/PoSt/1120_911484.HtM
BbS.okacop090.info/PoSt/1120_639129.HtM
BbS.okacop091.info/PoSt/1120_227815.HtM
BbS.okacop081.info/PoSt/1120_123330.HtM
BbS.okacop082.info/PoSt/1120_969595.HtM
BbS.okacop083.info/PoSt/1120_395521.HtM
BbS.okacop084.info/PoSt/1120_581427.HtM
BbS.okacop085.info/PoSt/1120_363470.HtM
BbS.okacop086.info/PoSt/1120_493407.HtM
BbS.okacop087.info/PoSt/1120_235959.HtM
BbS.okacop088.info/PoSt/1120_068334.HtM
BbS.okacop090.info/PoSt/1120_597357.HtM
BbS.okacop091.info/PoSt/1120_353371.HtM
BbS.okacop081.info/PoSt/1120_972568.HtM
BbS.okacop082.info/PoSt/1120_381031.HtM
BbS.okacop083.info/PoSt/1120_311711.HtM
BbS.okacop084.info/PoSt/1120_407669.HtM
BbS.okacop085.info/PoSt/1120_778567.HtM
BbS.okacop086.info/PoSt/1120_895573.HtM
BbS.okacop087.info/PoSt/1120_879446.HtM
BbS.okacop088.info/PoSt/1120_686005.HtM
BbS.okacop090.info/PoSt/1120_946546.HtM
BbS.okacop091.info/PoSt/1120_720105.HtM
