基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
设计模式是什么鬼(装饰)
设计模式是什么鬼(装饰)
阅读
1
2018-09-17
来源:轻文社
推荐:实战项目和学习资料
装饰,在某物件基础上加以修饰,装点,使得原本的朴素变得华丽,达到化腐朽为神奇的效果。比如我们从开发商买来的毛坯房,必然要进行室内装潢这么一项工程,什么简约风啊,北欧风啊,地中海,美式中式等等,当然萝卜青菜各有所爱,每个人装出的房子都各有差异,但不管何种风格,这都是对原本毛坯房的装饰,留给业主按照自己的喜好进行二次加工,这也是为什么有时候毛坯二手房比装修过的要好卖,有成品就一定得有半成品,这样才能把更多的选择留给用户,使得装饰成为可能。
人靠衣装马靠鞍,当然不止是装修有这么神奇的效果,对于女生化妆来说我们也是深有体会,每当女友回家卸妆后素面朝天的时候我们的内心是崩溃的,有种当初相亲被骗的感觉。
显而易见,女友每天出门之前进行的那场洗礼是多么的神圣,多么的不可或缺。诚然,化妆的过程对于男人来说充满了神秘色彩,但对于女人来说更像是一场洗礼,怀揣着信仰与敬畏感进行的一场仪式,最终会像魔法一般把自己的脸变得完美无瑕,更有甚者浓妆艳抹地连毛孔都看不到。
作为研发人员,我们一定不能放过对于这项神秘工程的拆解分析,开始我们的工作。首先每个人要展示自己那必然有一个标准行为
show
(),我们将它抽象出来作为接口
Showable
。
1public
%
20interface
%
20Showable
%
20
%
7B
%
0A2
%
20
%
20
%
20
%
20public
%
20void
%
20show
();//%
E5
%
AE
%
9A
%
E4
%
B9
%
89
%
E5
%
B1
%
95
%
E7
%
A4
%
BA
%
E8
%
A1
%
8C
%
E4
%
B8
%
BA
%
0A3
%
7D
%
0A
当然,女友会这门功夫了,所以实现了此行为并施展其“美丽的脸庞”了,但此时只是原生态的素颜。
1public
%
20class
%
20Girl
%
20implements
%
20Showable
%
7B
%
0A2
%
0A3
%
20
%
20
%
20
%
20
@
Override
%
0A4
%
20
%
20
%
20
%
20public
%
20void
%
20show
()%
20
%
7B
%
0A5
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
%
E5
%
A5
%
B3
%
E5
%
AD
%
A9
%
E7
%
9A
%
84
%
E7
%
B4
%
A0
%
E9
%
A2
%
9C
%
22
);%
0A6
%
20
%
20
%
20
%
20
%
7D
%
0A7
%
0A8
%
7D
%
0A
没什么复杂的,直接调用的话会是素面朝天直面惨淡的人生,这样当然达不到美颜效果了,何以登上人生巅峰。那么接下来要进行化妆了,这里必须依靠一种神秘而又昂贵的东西,化妆品登场了,它同样实现了
Showable
接口。
%
201public
%
20class
%
20Decorator
%
20implements
%
20Showable
%
7B
//%
E5
%
8C
%
96
%
E5
%
A6
%
86
%
E5
%
93
%
81
%
E7
%
B2
%
89
%
E9
%
A5
%
B0
%
E5
%
99
%
A8
%
0A
%
202
%
0A
%
203
%
20
%
20
%
20
%
20Showable
%
20showable
;//%
E6
%
8C
%
81
%
E6
%
9C
%
89
%
E6
%
9F
%
90
%
E4
%
B8
%
AA
%
E5
%
96
%
84
%
E4
%
BA
%
8E
%
E5
%
B1
%
95
%
E7
%
A4
%
BA
%
E7
%
9A
%
84
%
E5
%
AE
%
B6
%
E4
%
BC
%
99
%
0A
%
204
%
0A
%
205
%
20
%
20
%
20
%
20public
%
20Decorator
(
Showable
%
20showable
)%
20
%
7B
//%
E6
%
9E
%
84
%
E9
%
80
%
A0
%
E6
%
97
%
B6
%
E6
%
B3
%
A8
%
E5
%
85
%
A5
%
E8
%
BF
%
99
%
E4
%
B8
%
AA
%
E5
%
AE
%
B6
%
E4
%
BC
%
99
%
0A
%
206
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20this
.
showable
%
20
=%
20showable
;%
0A
%
207
%
20
%
20
%
20
%
20
%
7D
%
0A
%
208
%
0A
%
209
%
20
%
20
%
20
%
20
@
Override
%
0A10
%
20
%
20
%
20
%
20public
%
20void
%
20show
()%
20
%
7B
%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
%
E7
%
B2
%
89
%
E9
%
A5
%
B0
(%
22
);//%
E5
%
8C
%
96
%
E5
%
A6
%
86
%
E5
%
93
%
81
%
E7
%
B2
%
89
%
E9
%
A5
%
B0
%
0A12
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20showable
.
show
();//%
E8
%
BF
%
99
%
E5
%
AE
%
B6
%
E4
%
BC
%
99
%
E7
%
B4
%
A0
%
E9
%
9D
%
A2
%
E6
%
9C
%
9D
%
E5
%
A4
%
A9
%
E7
%
9A
%
84
%
E7
%
A7
%
80
%
0A13
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
)%
22
);//%
E7
%
B2
%
89
%
E9
%
A5
%
B0
%
E6
%
89
%
93
%
E5
%
AE
%
8C
%
E6
%
94
%
B6
%
E5
%
B7
%
A5
%
0A14
%
20
%
20
%
20
%
20
%
7D
%
0A15
%
0A16
%
7D
%
0A
我们可以发现,在构造化妆品类的时候可以把女孩给注入进来,目的在于调用女孩的
show
方法,但对于其原本的具体行为装饰器一无所知,并且没有加入任何逻辑限制,它所做的无非是“画龙点睛”,“锦上添花”。接下来我们来运行一下看结果。
1public
%
20class
%
20Client
%
20
%
7B
%
0A2
%
20
%
20
%
20
%
20public
%
20static
%
20void
%
20main
(
String
%
5B
%
5D
%
20args
)%
20
%
7B
%
0A3
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E7
%
94
%
A8
%
E8
%
A3
%
85
%
E9
%
A5
%
B0
%
E5
%
99
%
A8
%
E5
%
8C
%
85
%
E8
%
A3
%
B9
%
E5
%
A5
%
B3
%
E5
%
AD
%
A9show
%
E5
%
87
%
BA
%
E6
%
9D
%
A5
%
0A4
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20new
%
20Decorator
(
new
%
20Girl
()).
show
();%
0A5
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E7
%
BB
%
93
%
E6
%
9E
%
9C
%
EF
%
BC
%
9A
%
E7
%
B2
%
89
%
E9
%
A5
%
B0
(%
E5
%
A5
%
B3
%
E5
%
AD
%
A9
%
E7
%
9A
%
84
%
E7
%
B4
%
A0
%
E9
%
A2
%
9C
)%
0A6
%
20
%
20
%
20
%
20
%
7D
%
0A7
%
7D
%
0A
我们可以看到,只需要新建装饰器的时候把女孩给包装进去就得到了粉饰过的美颜,是不是非常简单?然而此时有女朋友会嫌弃了,“只是打粉底这么简单吗?眼霜呢?口红呢……”。
好吧,为了满足女友的要求,我们得再多一些设计。想想看这些化妆品,不管是什么都有共同的特性,也就是说他们统统都可以装饰原生态的素颜展示方法
show
,那我们何不把这些特性抽象出来呢?开始行动,修改我们的装饰类。
1public
%
20abstract
%
20class
%
20Decorator
%
20implements
%
20Showable
%
7B
%
0A
%
202
%
0A
%
203
%
20
%
20
%
20
%
20protected
%
20Showable
%
20showable
;%
0A
%
204
%
0A
%
205
%
20
%
20
%
20
%
20public
%
20Decorator
(
Showable
%
20showable
)%
20
%
7B
%
0A
%
206
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20this
.
showable
%
20
=%
20showable
;%
0A
%
207
%
20
%
20
%
20
%
20
%
7D
%
0A
%
208
%
0A
%
209
%
20
%
20
%
20
%
20
@
Override
%
0A10
%
20
%
20
%
20
%
20public
%
20void
%
20show
()%
20
%
7B
%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20showable
.
show
();//%
E7
%
9B
%
B4
%
E6
%
8E
%
A5
%
E8
%
B0
%
83
%
E7
%
94
%
A8
%
E4
%
B8
%
8D
%
E5
%
81
%
9A
%
E5
%
8A
%
A0
%
E4
%
BB
%
BB
%
E4
%
BD
%
95
%
E7
%
B2
%
89
%
E9
%
A5
%
B0
%
E3
%
80
%
82
%
0A12
%
20
%
20
%
20
%
20
%
7D
%
0A13
%
0A14
%
7D
%
0A
我们把化妆品类给改成抽象类,重写
show
方法,但不做任何粉饰了,这里我们留给子类具体的某个化妆品去做装饰吧。化妆首先第一步一定要打底了,这里我们首先加入一个粉底类。
%
201public
%
20class
%
20FoundationMakeup
%
20extends
%
20Decorator
%
7B
%
0A
%
202
%
0A
%
203
%
20
%
20
%
20
%
20public
%
20FoundationMakeup
(
Showable
%
20showable
)%
20
%
7B
%
0A
%
204
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20super
(
showable
);//%
E8
%
B0
%
83
%
E7
%
94
%
A8
%
E5
%
8C
%
96
%
E5
%
A6
%
86
%
E5
%
93
%
81
%
E7
%
88
%
B6
%
E7
%
B1
%
BB
%
E6
%
B3
%
A8
%
E5
%
85
%
A5
%
0A
%
205
%
20
%
20
%
20
%
20
%
7D
%
0A
%
206
%
0A
%
207
%
20
%
20
%
20
%
20
@
Override
%
0A
%
208
%
20
%
20
%
20
%
20public
%
20void
%
20show
()%
20
%
7B
%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
%
E6
%
89
%
93
%
E7
%
B2
%
89
%
E5
%
BA
%
95
(%
22
);%
0A10
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20showable
.
show
();%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
)%
22
);%
0A12
%
20
%
20
%
20
%
20
%
7D
%
0A13
%
7D
%
0A
我们可以看到粉底类继承了化妆品类,当然这个粉底的
show
方法一定要加以修饰了,在原生态的前后都进行了打粉底操作。同样地,打完粉底后再画个口红吧。
%
201public
%
20class
%
20Lipstick
%
20extends
%
20Decorator
%
7B
%
0A
%
202
%
0A
%
203
%
20
%
20
%
20
%
20public
%
20Lipstick
(
Showable
%
20showable
)%
20
%
7B
%
0A
%
204
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20super
(
showable
);%
0A
%
205
%
20
%
20
%
20
%
20
%
7D
%
0A
%
206
%
0A
%
207
%
20
%
20
%
20
%
20
@
Override
%
0A
%
208
%
20
%
20
%
20
%
20public
%
20void
%
20show
()%
20
%
7B
%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
%
E6
%
B6
%
82
%
E5
%
8F
%
A3
%
E7
%
BA
%
A2
(%
22
);%
0A10
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20showable
.
show
();%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
print
(%
22
)%
22
);%
0A12
%
20
%
20
%
20
%
20
%
7D
%
0A13
%
7D
%
0A
最后,我们把女友、粉底、口红层层包裹起来并运行,结果如愿以偿。
1public
%
20class
%
20Client
%
20
%
7B
%
0A2
%
20
%
20
%
20
%
20public
%
20static
%
20void
%
20main
(
String
%
5B
%
5D
%
20args
)%
20
%
7B
%
0A3
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E5
%
8F
%
A3
%
E7
%
BA
%
A2
%
E5
%
8C
%
85
%
E8
%
A3
%
B9
%
E7
%
B2
%
89
%
E5
%
BA
%
95
%
EF
%
BC
%
8C
%
E5
%
86
%
8D
%
E5
%
8C
%
85
%
E8
%
A3
%
B9
%
E5
%
A5
%
B3
%
E5
%
8F
%
8B
%
E3
%
80
%
82
%
0A4
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20Showable
%
20madeupGirl
%
20
=%
20new
%
20Lipstick
(
new
%
20FoundationMakeup
(
new
%
20Girl
()));%
0A5
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20madeupGirl
.
show
();%
0A6
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E8
%
BF
%
90
%
E8
%
A1
%
8C
%
E7
%
BB
%
93
%
E6
%
9E
%
9C
%
EF
%
BC
%
9A
%
E6
%
B6
%
82
%
E5
%
8F
%
A3
%
E7
%
BA
%
A2
(%
E6
%
89
%
93
%
E7
%
B2
%
89
%
E5
%
BA
%
95
(%
E5
%
A5
%
B3
%
E5
%
AD
%
A9
%
E7
%
9A
%
84
%
E8
%
84
%
B8
%
E5
%
BA
%
9E
))%
0A7
%
20
%
20
%
20
%
20
%
7D
%
0A8
%
7D
%
0A
如果女友对这种淡妆效果还是不满意,我们可以继续添加化妆品类,睫毛膏、眼线、眉笔、腮红等等等等,只需要层层包裹起来,最终实现女友浓妆艳抹的梦想。
我们观察这种装饰器模式结构,是不是似曾相识呢?没错,其实装饰器模式在
JDK
里就有很多应用,比如
Java
IO
包里的众多流处理类。
new
%
20BufferedReader
(
new
%
20InputStreamReader
(
new
%
20FileInputStream
(
filePath
)));%
0A
当然,流处理类当然要比我们的例子复杂的多,但其基本思想和我们去繁就简的例子异途同归,这些对象就好像是俄罗斯套娃一样层层包裹,层层装饰,每套一层就会多出一些功能出来,我们更可以自由搭配,实现不同的组合功能。
所以,不管是女生化妆还是程序员写代码,我们都不可能弄出一个巨大的类然后去搞定所有事情,如此代码会越堆积越多,难于维护,功能扩展更是举步维艰。我们都需要有这种设计思想,每个化妆品部件各司其职,不做和自己不相关的事,然后把部件层层叠加,并根据需求组装成型,以达最终的装饰目的。
点击图片加入
Spring
交流群
↓↓↓
看完本文有收获?请转发分享给更多人
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
MQ消息中间件,面试能问写什么?
下一篇:
面试官:你能说说SOA架构和微服务架构的区别嘛?
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目