需求:
有一个受保护的文件:
(1)对文件内容进行加密;
(2)任何用户都可以读,但只有管理员用户可以写。
方案1:

FileManager在写文件时,判断要写的文件是否受保护,如果受保护,判断用户是否是管理员。
void
FileManager::Write(File* file, string s)
{
if (PROTECTEDFILE == file.GetType() &&
ADMINISTRATOR != userId)
{
return;
}
file->Write(s);
}
缺点:
FileManager的Write函数,需要根据file的具体类型做区分处理。如果ProtectedFile的权限保护规则有变化,需要修改FileManager。FileManager对于权限保护规则的变化,不符合Open-Close原则。
方案2:

文件权限保护规则,放在ProtectedFileProxy中,且它实现了File接口,这样FileManager就可以把ProtectedFileProxy当作普通文件处理。
void
ProtectedFileProxy::Write(string s)
{
if (ADMINISTRATOR == userId)
{
m_pProtectedFile->Write(s);
}
}
void
FileManager::Write(File* file, string s)
{
file->Write(s);
}
总结:
1.作用:为其它对象提供一种代理以控制对这个对象的访问。
2.效果:Proxy模式在访问对象时引入了一定程度的间接性,这个间接性对用户是透明的,即用户不依赖于这种间接性的变化。附加的间接性有多种用途:
(1)Remote Proxy,访问远程对象,就跟访问本地对象一样。如RMI。
(2)Virtual Proxy,可以智能的决定创建对象的时机。
(3)Protection Proxy,允许在访问一个对象时有一些附加地内务处理(如权限检查)。