Layering & Contract Philosophy With additional indirection

 class CComponent
{
public: virtual void Operation() = ;
public: virtual void AddComponent(Component* p)= ;
public: virtual void RemoveComponent(Component* p)= ;
public: virtual Component* GetChild(int i) { return NULL;}
}
class CComposite: public CComponent
{
public: virtual void Operation()
{ foreach ( i ) GetChild(i)->Opeartion(); };
public: virtual void AddComponent(Component* p)
{ v.add( p );};
public: virtual void RemoveComponent(Component* p)
{ v.remove(p);}
public: virtual Component* GetChild(int i)
{ return v[i];}
private: vector< CComponent* > v;
}
class CLeaf: public CCompoent
{
public: virtual void Operation()
{ do_something_for_leaf(); };
}
class Client
{
CLeaf* pleaf1 = new CLeaf; CLeaf* pleaf2 = new CLeaf;
CLeaf* pleaf3 = new CLeaf; CLeaf* pleaf4 = new CLeaf;
CLeaf* pleaf5 = new CLeaf; CLeaf* pleaf6 = new CLeaf;
CComposite* pcomposite1, pcomposite2 = new CComposite;
pcomposite1.addcomponent(pleaf1);
pcomposite1.addcomponent(pleaf2);
pcomposite1.addcomponent(pleaf3);
pcomposite2.addcomponent(pleaf4);
pcomposite2.addcomponent(pleaf5);
pcomposite2.addcomponent(pcomposite1);
CComposite* pAll = new CComposite;
pAll.addComponent(pcomposite1);
pAll.addComponent(pcomposite2);
pAll.addComponent(pleaf6);
pAll.Opearation();
}

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.

Design Pattern ->Composite的更多相关文章

  1. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  2. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  3. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  4. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  5. 为什么要提倡“Design Pattern呢

    为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性. 那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principle,OCP).里 ...

  6. C++ Design Pattern: What is a Design Pattern?

    Q: What is a Design Pattern? A: Design Patterns represent solutions to problems what arise when deve ...

  7. Design Pattern in Simple Examples

    Instead of defining what is design pattern lets define what we mean by design and what we mean by pa ...

  8. java设计模式大全 Design pattern samples in Java(最经典最全的资料)

    java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...

  9. 为什么要提倡"Design Pattern"呢? 开闭原则 系统设计时,注意对扩展开放,对修改闭合。

    [亲身经历] 无规矩不成方圆 设计模式 - 搜狗百科 https://baike.sogou.com/v123729.htm?fromTitle=设计模式 为什么要提倡"Design Pat ...

随机推荐

  1. CF1096G Lucky Tickets 快速幂套FFT

    \(\color{#0066ff}{ 题目描述 }\) 一个\(n\)位数,每位可以是给出的\(k\)个数码中的一个数,可以有前导\(0\),输出前\(n/2\)位之和与后\(n/2\)位之和相等的方 ...

  2. Warning: Static member accessed via instance reference

    Warning: Static member accessed via instance reference Shows references to static methods and fields ...

  3. POJ1052 Plato's Blocks

    题目来源:http://poj.org/problem?id=1052 题目大意: 把1*1*1的小立方体通过粘接相邻面组成大的立方体的形状.如下图所示: 一层一层地堆叠,立方体从三个方向的投影会分别 ...

  4. codeforces 985C Liebig's Barrels(贪心)

    题目 题意: 有n * k块木板,每个木桶由k木板组成,每个木桶的容量定义为它最短的那块木板的长度. 任意两个木桶的容量v1,v2,满足|v1-v2| <= d. 问n个木桶容量的最大的和为多少 ...

  5. linu samba服务

    关闭防火墙并且重启网络yum install samba  samba-client samba-commmon -ysystemctl start smb smbclient -L //172.25 ...

  6. Asp.net获取系统信息

    [DllImport("kernel32")]        public static extern void GlobalMemoryStatus(ref MEMORY_INF ...

  7. .NET Core单元测试覆盖率统计coverlet配置和使用

    https://segmentfault.com/a/1190000017569492 需要使用: 使用 Moq 测试.NET Core 应用    https://www.cnblogs.com/c ...

  8. Index Skip Scan in Oracle in 11g

    http://viralpatel.net/blogs/oracle-index-skip-scan/ in 11g the same sql use index skip scan but in 1 ...

  9. 使用Koa.js,离不开这十个中间件

    随着ES6的普及,async/await的语法受到更多JS开发者的青睐,Koa.js作为比较早支持使用该语法的Node框架越来越受到大家的喜爱,虽然Koa.js本身支持的功能很有限,但官方和社区提供了 ...

  10. webstorm中.vue报错(es6语法报错)-转

    1.webstorm中es6语法报错,解决方法: 打开 Settings => Languages & Frameworks => Javascript把 Javascript L ...