• Design Pattern ->Composite


    Layering & Contract Philosophy With additional indirection

     1 class CComponent
     2 {  
     3     public: virtual void Operation() = 0;
     4         public: virtual void AddComponent(Component* p)= 0;
     5         public: virtual void RemoveComponent(Component* p)= 0;
     6         public: virtual Component* GetChild(int i) { return NULL;}
     7 }
     8 class CComposite: public CComponent
     9 {
    10        public: virtual void Operation()
    11        { foreach ( i ) GetChild(i)->Opeartion(); };
    12        public: virtual void AddComponent(Component* p)
    13        { v.add( p );};
    14        public: virtual void RemoveComponent(Component* p)
    15        { v.remove(p);}
    16        public: virtual Component* GetChild(int i) 
    17        { return v[i];}
    18        private: vector< CComponent* > v;
    19 }
    20 class CLeaf: public CCompoent
    21 {
    22     public: virtual void Operation() 
    23         {    do_something_for_leaf(); };       
    24 }
    25 class Client
    26 {
    27     CLeaf* pleaf1 = new CLeaf; CLeaf* pleaf2 = new CLeaf;           
    28     CLeaf* pleaf3 = new CLeaf; CLeaf* pleaf4 = new CLeaf; 
    29     CLeaf* pleaf5 = new CLeaf;   CLeaf* pleaf6 = new CLeaf;
    30     CComposite* pcomposite1, pcomposite2 = new CComposite;
    31      pcomposite1.addcomponent(pleaf1);
    32      pcomposite1.addcomponent(pleaf2);
    33      pcomposite1.addcomponent(pleaf3);
    34      pcomposite2.addcomponent(pleaf4);
    35      pcomposite2.addcomponent(pleaf5);
    36      pcomposite2.addcomponent(pcomposite1);
    37      CComposite* pAll = new CComposite;
    38      pAll.addComponent(pcomposite1);     
    39      pAll.addComponent(pcomposite2); 
    40      pAll.addComponent(pleaf6);
    41      pAll.Opearation();
    42 }

    Applicability

    Use the Composite pattern when:

    • you want to represent part-whole hierarchies of objects.
    • you want clients to be able to ignore the difference between compositions of objects and individual objects. Clients will treat all objects in the composite structure uniformly.

    Participants

    Component (Graphic)

    • declares the interface for objects in the composition.
    • implements default behavior for the interface common to all classes, as appropriate.
    • declares an interface for accessing and managing its child components.
    • (optional) defines an interface for accessing a component's parent in the recursive structure, and implements it if that's appropriate.

    Leaf (Rectangle, Line, Text, etc.)

    • represents leaf objects in the composition. A leaf has no children.
    • defines behavior for primitive objects in the composition.

    Composite (Picture)

    • defines behavior for components having children.
    • stores child components.
    • implements child-related operations in the Component interface.

    Client

    • manipulates objects in the composition through the Component interface.

    Collaborations

    • Clients use the Component class interface to interact with objects in the composite structure. If the recipient is a Leaf, then the request is handled directly. If the recipient is a Composite, then it usually forwards requests to its child components, possibly performing additional operations before and/or after forwarding.
  • 相关阅读:
    Surface RT2装Win10出现 "INF不包含数字签名信息"【已解决】
    树上倍增LCA模版
    sql注入
    python 调用 telnet
    ss
    【总结氵】2021.02.27 省选模拟
    2021.03.13省选模拟 抽卡(card)
    树链剖分之重链剖分 模板
    多项式求逆 模板
    NTT快速数论变换 模板
  • 原文地址:https://www.cnblogs.com/iiiDragon/p/3268462.html
Copyright © 2020-2023  润新知