(转载)Decorator模式---实现一个验证程序 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三种产品。
 
阅读更多
上一篇(转载)Visitor模式---实现家人行为 http://hi.baidu.com/huangrg/blog/item/aa9e46c7feaeebdfd100608c.html
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭