Composite和Decorater模式联系和区别

组合模式使用情景:为了给外部一个多个子类组合而成的对象时候,为了分离耦合和提供拓展性可以采用组合模式-得到树形结构,而不是拓展性不好的管理器模式。

装饰模式使用情景:为了方便修改装饰已经存在的类,保存现有类的引用,提供更可拓展的方案,而不是继承现有的类;装饰模式在需要被装饰体(游戏角色)身上经常使用,如果不继承被装饰(角色)类,而是独立做一个Plugin只是保存被装饰(角色)类的引用也可以做到,但是继承被装饰(角色)类更加方便修改装饰(角色)。

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

Composite模式UML类图:

Composite和Decorater模式联系和区别_第1张图片

Composite对各个子类组合后为:

Composite和Decorater模式联系和区别_第2张图片

抽象构件角色(component):是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。这个接口可  以用来管理所有的子对象。(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。  
树叶构件角色(Leaf):在组合树中表示叶节点对象,叶节点没有子节点。并在组合中定义图元对象的行为。
树枝构件角色(Composite):定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。
客户角色(Client):通过component接口操纵组合部件的对象。

组合模式和其他相关模式
    1)装饰模式(Decorator模式)经常与Composite模式一起使用。当装饰和组合一起使用时,它们通常有一个公共的父类。因此装饰必须支持具有 Add、Remove和GetChild 操作的Component接口。


装饰器模式也是维护父类的指针。

装饰器模式: 动态地给一个对象添加一些额外的职责或者行为。就增加功能来说, Decorator模式相比生成子类更为灵活。
       装饰器模式提供了改变子类的灵活方案。装饰器模式在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
       当用于一组子类时,装饰器模式更加有用。如果你拥有一族子类(从一个父类派生而来),你需要在与子类独立使用情况下添加额外的特性,你可以使用装饰器模式,以避免代码重复和具体子类数量的增加。

装饰器UML类图:

Composite和Decorater模式联系和区别_第3张图片

 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这些对象动态地添加职责。
    具体组件角色(ConcreteComponent) :被装饰者,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。
    抽象装饰器(Decorator):维持一个指向构件Component对象的实例,并定义一个与抽象组件角色Component接口一致的接口。
    具体装饰器角色(ConcreteDecorator):向组件添加职责。

装饰器模式与其他相关模式
    1)Adapter 模式:Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不改变它的接口;而适配器将给对象一个全新的接口。
    2)Composite模式:可以将装饰视为一个退化的、仅有一个组件的组合。然而,装饰仅给对象添加一些额外的职责—它的目的不在于对象聚集
    3)Strategy模式:用一个装饰你可以改变对象的外表;而Strategy模式使得你可以改变对象的内核。这是改变对象的两种途径。



你可能感兴趣的:(Composite和Decorater模式联系和区别)