每天一个设计模式之装饰器模式 Qt系列教程 C++

  • A+

解决问题

装饰器模式用于解决继承无法解决的问题。如有个需求,要开发一个登录功能,涉及qq登录、微信登录、手机登录三种方式,此时就需要创建一个login接口类,并实现三个登录子类;但如果又有个新需求,希望在所有的登录界面上加一些前缀信息,这时候,需要将三个登录子类再继承一遍,实现前缀信息显示功能;如果再有个需求,希望再前缀的基础上再增加后缀功能,则需要每个子类再继承一遍,实现后缀信息显示功能,类图如下。这样就会导致一个问题:子类膨胀。装饰器模式就是用于解决这种问题的方法。

每天一个设计模式之装饰器模式 Qt系列教程 C++

达到目的

三种登录方式的前缀显示和后缀显示功能,其实都是一样的,没有必要为每种登录方式都开发一个前缀显示和后缀显示功能,因此,我们可以将封装一个装饰器抽象类Decorate,继承LoginInterface,并实现login方法,并创建两个子类前缀子类和后缀子类,分别继承Decorate,使用时,将被装饰类传入各个装饰类,进而达到组合装饰的效果。

代码

  1. #include <QDebug>
  2. //接口
  3. class CView
  4. {
  5. public:
  6.     virtual void Draw(){}
  7. };
  8. //抽象装饰类
  9. class CDecorate:public CView{
  10. public:
  11.     CDecorate(CView* pView):m_pView(pView){}
  12. public:
  13.     virtual void Draw()
  14.     {
  15.         m_pView->Draw();
  16.     }
  17. private:
  18.     CView* m_pView;
  19. };
  20. //装饰类1
  21. class CScrollBars:public CDecorate{
  22. public:
  23.     CScrollBars(CView* pView):CDecorate(pView){}
  24. protected:
  25.     //绘制滚动条
  26.     void DrawScrollBar(){
  27.         qDebug()<<Q_FUNC_INFO<<__LINE__;
  28.     }
  29. public:
  30.     virtual void Draw()
  31.     {
  32.         CDecorate::Draw();
  33.         DrawScrollBar();
  34.     }
  35. };
  36. //装饰类2
  37. class CBorder:public CDecorate{
  38. public:
  39.     CBorder(CView* pView):CDecorate(pView){}
  40. protected:
  41.     //绘制边框
  42.     void DrawBorder(){
  43.         qDebug()<<Q_FUNC_INFO<<__LINE__;
  44.     }
  45. public:
  46.     virtual void Draw()
  47.     {
  48.         CDecorate::Draw();
  49.         DrawBorder();
  50.     }
  51. };
  52. //上下文,被装饰对象
  53. class CTextView:public CView{
  54. public:
  55.     CTextView(){
  56.     }
  57. protected:
  58.     virtual void DrawTextView(){
  59.         qDebug()<<Q_FUNC_INFO<<__LINE__;
  60.     }
  61. public:
  62.     virtual void Draw()
  63.     {
  64.         CView::Draw();
  65.         DrawTextView();
  66.     }
  67. };
  68. int main(int argc, char *argv[])
  69. {
  70.     CTextView* cTextView = new CTextView();
  71.     CScrollBars* cScrollBars = new CScrollBars(cTextView);
  72.     CBorder* cBorder = new CBorder(cScrollBars);
  73.     cBorder->Draw();
  74. }
Qt大课堂-QtShare

发表评论

您必须登录才能发表评论!