目录 1.动机(Motivation) 2.模式定义 3.要点总结 4.代码感受
1.动机(Motivation)
软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象结构)的变化引起客户代码的频繁变化 ,带来了代码的维护性、扩展性等弊端 如何将”客户代码与复杂的对象容器结构“解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?
2.模式定义
定义 :将对象组合成树形结构 以表示”部分-整体 “的层次结构功能 :Composite使得用户对单个对象和组合对象的使用具有一致性 (稳定)结构
3.要点总结
Composite模式采用树性结构 来实现普遍存在的对象容器,从而将”一对多 “的关系转化为”一对一 “的关系,使得客户代码可以一致地(复用)处理对象和对象容器, 无需关心处理的是单个的对象,还是组合的对象容器 将“客户代码与复杂的对象容器结构”解耦 是Composite的核心思想 ,解耦之后,客户代码与纯粹的抽象接口 —— 而非对象容器的内部实现结构发生依赖,从而更能”应对变化“ Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技术来改善效率
4.代码感受
class Component
{
public : virtual void process ( ) = 0 ; virtual ~ Component ( ) { }
} ;
class Composite : public Component
{ string name; list< Component* > elements;
public : Composite ( const string& s) : name ( s) { } void add ( Component* element) { elements. push_back ( element) ; } void remove ( Component* element) { elements. remove ( element) ; } void process ( ) { for ( auto & e : elements) e-> process ( ) ; }
} ;
class Leaf : public Component
{ string name;
public : Leaf ( string s) : name ( s) { } void process ( ) { }
} ; void Invoke ( Component& c)
{ c. process ( ) ;
} int main ( )
{ Composite root ( "root" ) ; Composite treeNode1 ( "treeNode1" ) ; Composite treeNode2 ( "treeNode2" ) ; Composite treeNode3 ( "treeNode3" ) ; Composite treeNode4 ( "treeNode4" ) ; Leaf leat1 ( "left1" ) ; Leaf leat2 ( "left2" ) ; root. add ( & treeNode1) ; treeNode1. add ( & treeNode2) ; treeNode2. add ( & leaf1) ; root. add ( & treeNode3) ; treeNode3. add ( & treeNode4) ; treeNode4. add ( & leaf2) ; process ( root) ; process ( leaf2) ; process ( treeNode3) ;
}