zoukankan      html  css  js  c++  java
  • Decorator Pattern

    1.Decorator 模式通过组合的方式提供了一种给类增加职责(操作)的方法。

    2.Decorator模式结构图

    3.实现

     1 #ifndef _DECORATOR_H_ 
     2 #define _DECORATOR_H_
     3 
     4 class Component 
     5 { 
     6 public: 
     7     virtual ~Component();
     8     virtual void Operation();
     9 protected: 
    10     Component();
    11 private:
    12 };
    13 
    14 class ConcreteComponent:public Component 
    15 { 
    16 public: 
    17     ConcreteComponent();
    18     ~ConcreteComponent();
    19     void Operation();
    20 protected:
    21 private:
    22 };
    23 
    24 class Decorator:public Component 
    25 { 
    26 public: 
    27     Decorator(Component* com);
    28     virtual ~Decorator();
    29     void Operation();
    30 protected: 
    31     Component* _com;
    32 private: 
    33 };
    34 
    35 class ConcreteDecorator:public Decorator 
    36 { 
    37 public: 
    38     ConcreteDecorator(Component* com);
    39     ~ConcreteDecorator();
    40     void Operation();
    41     void AddedBehavior();
    42 protected:
    43 private:
    44 };
    45 
    46 #endif
    Decorator.h
     1 #include "Decorator.h"
     2 #include <iostream>
     3 
     4 Component::Component() 
     5 {
     6 
     7 }
     8 Component::~Component() 
     9 {
    10 
    11 }
    12 void Component::Operation() 
    13 {
    14 
    15 }
    16 ConcreteComponent::ConcreteComponent() 
    17 {
    18 
    19 }
    20 ConcreteComponent::~ConcreteComponent() 
    21 {
    22 
    23 }
    24 void ConcreteComponent::Operation() 
    25 { 
    26     std::cout<<"ConcreteComponent operation..."<<std::endl; 
    27 }
    28 Decorator::Decorator(Component* com) 
    29 { 
    30     this->_com = com; 
    31 }
    32 Decorator::~Decorator() 
    33 { 
    34     delete _com; 
    35 }
    36 void Decorator::Operation() 
    37 {
    38 
    39 }
    40 ConcreteDecorator::ConcreteDecorator(Component*com):Decorator(com) 
    41 {
    42 
    43 }
    44 ConcreteDecorator::~ConcreteDecorator() 
    45 {
    46 
    47 }
    48 void ConcreteDecorator::AddedBehavior() 
    49 { 
    50     std::cout<<"ConcreteDecorator::AddedBehacior...."<<std::endl; 
    51 } 
    52 void ConcreteDecorator::Operation() 
    53 { 
    54     _com->Operation();
    55     this->AddedBehavior();
    56 }
    Decorator.cpp
     1 //main.cpp
     2 #include "Decorator.h"
     3 #include <iostream> 
     4 using namespace std;
     5 
     6 int main(int argc,char* argv[]) 
     7 { 
     8     Component* com = new ConcreteComponent();
     9     Decorator* dec = new ConcreteDecorator(com);
    10     dec->Operation();
    11     delete dec;
    12     return 0; 
    13 }
    main.cpp

    4.Decorator模式的讨论

      为了多态,通过父类指针指向其具体子类,但是这就带来另外一个问题,当具体子类要添加新的职责,就必须向其父类添加一个这个职责的抽象接口,否则是通过父类指针是调用不到这个方法了。这样处于高层的父类就承载了太多的特征(方法),并且继承自这个父类的所有子类都不可避免继承了父类的这些接口,但是可能这并不是这个具体子类所需要的。而在Decorator模式提供了一种较好的解决方法,当需要添加一个操作的时候就可以通过Decorator模式来解决,你可以一步步添加新的职责。

  • 相关阅读:
    CSharpGL(26)在opengl中实现控件布局/渲染文字
    CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子
    some OpenGL constants
    CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator
    CSharpGL(22)实现顺序无关的半透明渲染(Order-Independent-Transparency)
    CSharpGL(21)用鼠标拾取、拖拽VBO图元内的点、线或本身
    批量重命名文件
    [译]基于GPU的体渲染高级技术之raycasting算法
    CSharpGL(20)用unProject和Project实现鼠标拖拽图元
  • 原文地址:https://www.cnblogs.com/programmer-wfq/p/4661507.html
Copyright © 2011-2022 走看看