(转载)Decorator模式---实现一个验证程序
下面是我们实际工作中的一个模块, 作了简化, 贴出来供大家参考. 类图copy不过来, 可以参考原文: http://hi.baidu.com/huangrg/blog/item/76fe53ddb58169da8d1029c6.html
---------------------------------------------------------------
Decorator可以动态地为某个对象增加一些职责.
考虑一个密码验证程序,该程序是一个基于TCP的Client,她的基本功能是发出带有用户名、密码以及其它附加信息的请求给Server,之后得到 Server的回应.而且要求在不同的网络环境中具备不同的安全级别: 0级别,明文传输; 1级别,仅加密密码;2级别,满足1级别的同时,用SSL加密整个数据包。
根据需求可以考虑用Decorator模式进行设计,对1级别和2级别进行修饰。该程序类模型如下:
VerifierComponent:公共接口。
Verifier: 实现了最基本的功能:处理,发送,收回应等。
VerifierDecorator: 修饰类的基类。
EncryptoPwdDecorator: 加密密码的修饰类。
SSLDecorator: 加密整个数据包的修饰类。
根据类模型我们可以容易地实现代码。
说明:
1)本来代码中都用显示声明,为了缩短代码,将namespace去掉;
2)真正的程序中有一些附加数据,在例子中不给予体现;
3) 用输出到控制台的文本来模拟实际动作
struct VerifierComponent
{
virtual void Verify(const string& user, const string& pwd) = 0;
};
class Verifier : public VerifierComponent
{
public:
virtual void Verify(const string& user, const string& pwd)
{
cout << "Level0:encode verifier packet;\n";
}
};
class VerifierDecorator : public VerifierComponent
{
public:
VerifierDecorator(VerifierComponent* component)
{
component_ = component;
}
virtual void Verify(const string& user, const string& pwd)
{
component_->Verify(user, pwd);
}
private:
VerifierComponent* component_;
};
class EncryptoPwdDecorator : public VerifierDecorator
{
public:
EncryptoPwdDecorator(VerifierComponent* component)
: VerifierDecorator(component)
{
}
virtual void Verify(const string& user, const string& pwd)
{
VerifierDecorator::Verify(user, pwd);
Encrypto();
}
private:
void Encrypto()
{
cout << "Level1:encrypto password!\n";
}
};
class SSLDecorator : public VerifierDecorator
{
public:
SSLDecorator(VerifierComponent* component)
: VerifierDecorator(component)
{
}
virtual void Verify(const string& user, const string& pwd)
{
VerifierDecorator::Verify(user, pwd);
SSL();
}
private:
void SSL()
{
cout << "Level2.SSL encrpyto packet!\n";
}
};
应用"级别2"进行验证的调用代码:
VerifierComponent* component = new SSLDecorator(new EncryptoPwdDecorator(new Verifier));
component->Verify("loginer", "123456");
最后补充一下,可以考虑用"Abstract Factory模式"创建Level0,Level1和Level2三种产品。