设计模式-组合、装饰

146 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、组合模式

定义: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

理解: 组合模式就是将对象组合起来,形成树形结构,描述的是整体与部分的关系,例如总公司下部门和分公司,文件与文件夹等。组合模式包含三个角色,抽象构件角色是一个抽象接口,表示树的根节点;树叶构件角色是树形结构中的叶子节点,用于继承或实现抽象构件;树枝构件角色表示树的树枝节点,下面还可以有树枝节点或者叶子节点,用于继承和实现抽象构件通常包含 Add()、Remove()、GetChild() 等方法。组合模式分为透明式的组合模式和安全式的组合模式。透明方式中抽象构件声明了所有子类中的全部方法,所以客户端不用区别树叶对象和树枝对象,对客户端来说是透明的,遵循了依赖倒转原则。安全模式在抽象组件中只定义一些默认的行为或属性,它是把树枝节点和树叶节点彻底分开,客户端调用时要知道树枝对象和树叶对象。

优点: 不用关心处理的是单个对象还是组合对象容器,简化代码;当有新对象时容易添加,客户端不用改变代码,符合开闭原则。

缺点: 设计复杂,客户端需要花更多时间清理类之间的关系;不容易限制容器中的构件;不容易用继承的方法来增加构件的新功能。

场景: 再需要表示对象的整体与部分结构的场合,例如文件系统;隐藏组合对象与单个对象的不同,用户可以统一使用组合结构中的所有对象。

二、装饰模式

定义: 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

理解: 装饰模式就螺蛳粉,有的人喜欢加煎蛋,火腿,花生,香菜等等,螺蛳粉本身就是被装饰者,煎蛋,火腿等就是装饰者,装饰者是要附着在被装饰者上的,并且被装饰者被装饰后也是被装饰者。装饰模式有4个角色,抽象构件角色定义一个抽象接口以规范准备接收附加责任的对象;具体构件角色实现抽象构件,通过装饰角色为其添加一些职责;抽象装饰角色继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能;具体装饰角色实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。装饰模式主要用于对已有功能动态地添加功能的一种方式。通过对对象进行包装,使得装饰对象的实现和对象进行分离,从而装饰对象只需要关心自己的功能,而不需要关心如何添加到对象链中。

优点: 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用。

缺点: 装饰模式会增加许多子类,过度使用会增加程序得复杂性。

场景: 当对象的功能要求可以动态地添加,也可以再动态地撤销时。当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。