设计模式-Decorator(装饰器模式)

199 阅读5分钟

文章结构 -什么是装饰器模式-意义 -实例 -解释 -图解

什么是装饰器模式

假如,现在有一个蛋糕,如果只是涂上奶油,那么现在这块蛋糕就是奶油蛋糕,那么加上草莓就是草莓蛋糕,加上巧克在巧克力上写上生日快乐,那么就是一个生日蛋糕。
所以不论是草莓蛋糕还是生日蛋糕,其主题都是蛋糕,都是在其蛋糕上做装饰,程序对象和蛋糕还是十分相似的,可以在程序对象上不断的添加新的功能,这种设计模式叫做装饰模式Decorator模式。

意义

对单个对象进行操作,可以进行增强或者削弱的功能,可以比较灵活的对产品提出的需求 进行增加或者修改

实例

说明:从本章开始不想贴代码了,觉得代码影响文章可读性

项目结构分析

我们可以从当前项目结构进行分析: 处于最顶层的类是一个抽象类Disply 而该抽象类有两个实现类一个时StringDiPlay() 另外一个时Border()这个类 ,显而易见border的意思时边框 就是修饰边框的意思,而String的意思是字符串,就是修饰一个字符串; 而Border底下还是有具体的是实现类,有全边框,上下边框,测边框 三个修饰类
image.png

Dispalay()类解析

从这个类看:该类提供了多个抽象方法,作为一个顶级的类,提供了获取横向字符数,获取纵向字符数,和获取第几行的第几个字符串,并有一个字符串可以打印或展示出所有的行和列的字符串


image.png

Border()类解析

作为一个边框描述类,属于第二层级,的初始实现,但该类低下还是更细致的实现,该类提供的字段和方法都属于protected方法所有子类都可以使用
image.png

FullBorder()全边框类解析

该类属于第三层或者说第二层及的具体实现类,该类有Border的所有功能,也有Display类的抽象接口的具体实现,该类获取行和列的方法 都是在边边+1 那么也就是也为这在边边包装一行,同时提供了getRowText(row)方法,该方法在第一行和最后一行提供了自己的包围方法(因其提供的方法都进行了+1 所以可以提供0和+1这个选项)剩下一个其实是调用的Display的getRowText()因为传入的类是StringBorder该类的父类是Display所以当不是第一行和最后一行的时候只是打印了一个传入的字符 那么又为什么进行了-1操作是因为该方法其他类型都是在外面包裹了一圈,而该方法取得的行的长度是 传入字符串的长度,所以为了统一就进行了-1操作
image.png

SideBorder() 侧边框类解析

该类属于第三层级或者第二层的具体实现,该类为测边框类所以 顶部和底部 也就是或者getRows();返回的方法就是原长度,而在获取列的长度的时候,进行了两边+1的操作 也就是在原基础上进行了两边+1操作 进行自己的打印操作,而提供的getRowText方法也就之后将需要拼接的字符串拼接在原字符串的两边,然后在顶级类DisPlay调用show的时候 在全部的两边加上你传入的字符串

image.png

UpDownBorder()上下边框类解析

该类属于第三层级或者第二层的实现,该类为上下边框类,所以在获取getCloumns()的长度的时候只是获取了原字符串长度不进行操作,而在获取上下也就是行的长度的时候进行了两边+1的操作 也就是在纵向两侧进行+1操作,该方法提供的getRowText()方法 有提供判断操作,也就是说在判断为是第一行和最后一行的时候执行自己的方法,将自己传入的字符串按照该行列的长度进行打印或者拼接,而不是第一行和最后一行的时候,就正常拼接字符串不进行改变

image.png

main方法 来进行测试一下

b1,在第一层调用顶级类show()方法的时候,就是使用的默认的将其打印出来 b2,在第二层拿到了b1的参数后,选择上下拼接-这个操作,也就是变成了 上下-的打印 b3, 在第三层拿到了b2的参数是,此时b2已经不是第一个字符串了,而是拼接后的字符串因为其b2也就是上下边框操作时的mateLine方法进行了解析拼接操作,所以b3拿到的是第二个打印的参数,作为display的基础参数,来 进行两侧的拼接 此时我们看到了第三个打印的方法 image.png

image.png

解释+图解

Component 作为增加功能的核心类,在本例子中由DisPlay进行担任,
ConcreteComponent 该类是实现了Component角色自定义接口的实体类,在本例中由StringDisPlay类担任
Decorator(装饰类)该类有Component具体的实体类作为该类的 一个字符
ConcerteDecorator(具体的装饰实体类)在演示过程中由 FullBorder() SideBorder() UpDownBorder() 三个类来扮演

修饰者模式.png