装饰者模式:在不改变原来类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
需要满足以下设计原则: 1 多用组合,少用继承 2 开放-关闭原则:类应该对拓展开放,对修改关闭(这是设计模式基本原则之一吧)
UML类图 我们先来看看装饰者模式的类图
1 Component是基类。通常是一个抽象类或者一个接口,定义了属性或者方法,方法的实现可以由子类或者自己实现,它约束了整个继承树的行为。 2 ConcreteComponent是Component的子类,实现了相应的方法,它充当了“被装饰者”的角色。 3 Decorator也是Component的子类,它是装饰者共同实现的抽象类(也可以是接口) 4 ConcreteDecorator是Decorator的子类,是具体的装饰者,由于它同时也是Component的子类,因此它能方便地拓展Component的状态(比如添加新的方法)。每个装饰者都应该有一个实例变量用以保存Component的引用,这也是利用了组合的特性,在持有Component的引用后,那么相当于ConcreteDecorator包裹了Component,不但有Component的特性,同时自身也可以有别的特性,也就是所谓的装饰。
举个例子更好说明: 你有一家服装店,卖各式各样的衣服,把客户当做被装饰者,衣服是装饰者。接着我们来一步一步实现需求: 第一步:
创建Component基类
第二步:创建被装饰者ConcreteComponent 客户分为很多种,有儿童,青少年,成年人等,因此我们可以创建不同的被装饰者,这里我们创建青少年的被装饰者,新建Teenager.kt
第三步:创建Decorator
我们对人有不同的装饰品,比如说衣服,帽子,鞋子等等,我们可以具体装饰者的一个基类,FatherDecorator.kt
第四步:创建ConcreteDecorator 我们基于父类FatherDecorator进行拓展,创建出不同的装饰者,例如创建一个衣服装饰者ClotingDecorator,或者鞋子装饰者。
Demo测试例子:
我们总结一下装饰者模式的特点: 1 装饰者和被装饰者有相同的接口(或相同的父类)。 2 装饰者保存了一个被装饰者的引用。 3 在运行时动态地为对象添加属性,不必改变对象的结构。
使用装饰者模式的最大好处就是其拓展性十分良好,通过使用不同的装饰类来使得对象具有多种多样的属性,灵活性比直接继承好。