(转载)Decorator模式---实现一个验证程序 http://hi.baidu.com/huangrg/blog/item/76fe53ddb58169da8d1029c6.html

原创 2007年09月14日 17:47:00
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三种产品。
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

MyEclipse安装SVN插件以及Myeclipse9.0(转载http://hi.baidu.com/zzcc_8/blog/item/5d6dd1f3be34e459342acc4f.html)

一、MyEclipse 6.X6.x的操作比较简单,可通过官方提供的链接,利用MyEclipse内置的Find and Install功能来安装。1. 打开Myeclipse,在菜单栏中选择Help→...

location.hash实现跨域iframe自适应(转自:http://hi.baidu.com/leolance/blog/item/2ec6f3ee5a7152c3d439c923.html)

使用iframe实现跨域自适应长宽
  • lslxdx
  • lslxdx
  • 2011-04-07 13:31
  • 1208

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

vim windows配置 http://hi.baidu.com/leemoncc/blog/item/a6be15cf40d7ab31b600c806.html

原作地址:http://hi.baidu.com/leemoncc/blog/item/a6be15cf40d7ab31b600c806.html 当然,对我的环境而言,有问题和有所修改。需要注...

关于sqlite3的性能(转自:http://hi.baidu.com/snailzone/blog/item/da9368662bc94f25aa184c2b.html)

我想对于80%的网站来说,它们的数据量采用access数据库已经足够了。使用mysql或者sqlserver这些中型数据库,往往需要增加额外的使用费,而且数据量不大的时候,它们所反映的性能跟acces...
  • lslxdx
  • lslxdx
  • 2011-11-06 16:38
  • 1337

http://hi.baidu.com/2young22/blog/item/24fd6d8a3983d5739f2fb405.html

http://hi.baidu.com/2young22/blog/item/24fd6d8a3983d5739f2fb405.html Windows XP 下安装 QT4 开发环境 2010-...

IIS设置允许下载.exe文件的解决方法(转自:http://hi.baidu.com/greenyork/blog/item/81da2a001d2175091d958319.html)

IIS设置允许下载.exe文件的解决方法1.设置MIME,让IIS支持更多文件类型,如果MIME类型中已经有.exe,这一步可以跳过。打开IIS,选中服务器,点右键,属性里有MIME类型添加扩展名:....
  • lslxdx
  • lslxdx
  • 2011-07-16 16:03
  • 4352

显示html/css的警告错误或错误(转自:http://hi.baidu.com/86727515/blog/item/f030f0050fa8c1c77b89471d.html)

原文地址:You could display CSS/HTML errors as warnings or as errors 在vs2008里面可以有个很cool的功能,可以降级显示作为任何警...
  • lslxdx
  • lslxdx
  • 2011-11-18 10:03
  • 1655

java API提供的方法实现排序 如file按日期和大小排序(转:http://hi.baidu.com/axhack/blog/item/00514c0900605284d1581bab.html)

java API提供的方法实现排序 如file按日期和大小排序2008-10-06 23:25摘要:经常看见有人还在不厌其烦的用冒泡(最常见!)或是交换做排序,实际上用几行代码就可以既快又好地实现排序...

FTP客户端软件FileZilla使用教程(转自:http://hi.baidu.com/%B8%DF%C7%E5%D6%AE%D3%D1/blog/item/36d6c8b6dc0589fc30a)

描述: FileZilla是一个免费开源的FTP客户端软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高...
  • lslxdx
  • lslxdx
  • 2011-09-29 14:10
  • 1794

gcov lcov的使用http://hi.baidu.com/gtfcugb/blog/item/cf18d97b6ff161f20bd187ea.html

一、关于gcov工具 gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。 1、如何使用g...
  • hcmmin
  • hcmmin
  • 2011-04-21 16:57
  • 1323
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)