前言
哪天面试,如果面试官问你懂装饰着模式吗?你要说不懂,吆喝 那基本就完蛋了!顾明思议吗?装饰者 就是 装修吗? 对你得形体就行简单的装修而已,比如就像装修房子 首先粉墙,家具,家电不就好了!如果想有情调点,弄个鱼缸,在弄个喷雾器,有种水帘洞的感觉,当你对你这个价不停的进行装饰,那就是装饰着模式,不改变房子的主体,对外进行修饰
定义
装饰模式 是不对原来的类进行改变,或者不通过继承对原来的类功能的扩展,通过包装对象,来粉饰对象,以达到类要实现的功能
使用场景
学习Android的应该都知道ContextImpl 这个类,activity里面很多的startActivity 功能都不是自己实现的是,是通过ContextImpl 实现的,如果以后功能发生了改变,我们总不能在原来的类就行修改吧,这样就违背了开闭原则,对修改进行关闭,就扩展就行开放,所以我们应该对外扩展,不应该修改,为啥继承不能实现那,因为这是经常发生改变的,如果用继承的话,这样我们会迭代很深的。
具体业务场景
过几天都要过节赶庙会了!李麻 捏几个玩偶到会上卖,去会上卖,结果卖了一天,一个都没卖出去,李麻问媳妇,怎么回事啊 卖一天都没卖出去,小孩还等着交学费那,李麻媳妇抱怨,你做的什么玩意,人家卖的有颜色,而且还有配件,咱们就光秃秃的玩偶,根本没人买啊,李麻头大了!我草这也不能全部砸了 从新捏啊!这样违背了生活原则啊!砸了多可惜,最好在这基础上进行改造,然后李麻给学习计算机的儿子打电话,毕竟儿子大学生见识多!然后儿子说 你把各种玩偶得备件先做好,然后把配件安装上上去,统一在上色不久行了!就是原来的玩偶不变,只做玩偶配件,装上之后 然后上色,不就完了了!李麻开始整了!
李麻代码实现
玩偶的实现
1,先创建一个玩偶的接口,一切皆接口,尽量使用接口原则
interface IDollShape {
fun createDoll()
}
2,然后实现并造一个玩偶
class RealDoll : IDollShape {
override fun createDoll() {
Log.d("李桂云", ">>---------------------------------------------->>")
Log.d("李桂云", "造一个玩偶")
}
}
3,我们创建一个装饰着类,这个类主要承上启下的作用,一遍可以造玩偶,一遍可以调用装饰者的方法,这个类是抽象类不做任何实现
abstract class DollDecorator(private val iDollShape: IDollShape) : IDollShape {
override fun createDoll() {
iDollShape.createDoll()
}
}
4,那我们现实一个配偶类,这个配偶类是集成装饰者类,对当前木偶进行修饰
class ReplacementDecorator(private val iDollShape: IDollShape) : DollDecorator(iDollShape) {
override fun createDoll() {
super.createDoll()
createReplacement()
}
private fun createReplacement() {
Log.d("李桂云", "添加一个配件")
}
}
5,我们在创建一个颜色修饰类,是对木偶进行颜色修饰
class ColorDecorator(private val iDollShape: IDollShape) : DollDecorator(iDollShape) {
override fun createDoll() {
super.createDoll()
createColor()
}
private fun createColor() {
Log.d("李桂云", "添加一个颜色")
}
}
目前我们类都创建好了下面我们就开始实现
@JvmStatic
fun main(args: Array<String>) {
//玩偶
val iDollShape: IDollShape = RealDoll()
iDollShape.createDoll()
//有配件的玩偶
val iReplacementDecorator: IDollShape = ReplacementDecorator(iDollShape)
iReplacementDecorator.createDoll()
//有颜色的有配件的的玩偶
val iColorDecorator: IDollShape = ColorDecorator(iReplacementDecorator)
iColorDecorator.createDoll()
}
1,最上面我们只是创建一个木偶
2,我们把创建的木偶给配件装饰类,就是先创建木偶然后在添加配件
3,我们把配件类给颜色装饰者,就是携带配件的木偶进行颜色
下面我们看看打印结果
2020-10-08 09:34:51.738 9294-9294/com.xhs.mvvm D/李桂云: ##----------------------------------------------##
2020-10-08 09:34:51.739 9294-9294/com.xhs.mvvm D/李桂云: 造一个玩偶
2020-10-08 09:34:51.740 9294-9294/com.xhs.mvvm D/李桂云: ##----------------------------------------------##
2020-10-08 09:34:51.740 9294-9294/com.xhs.mvvm D/李桂云: 造一个玩偶
2020-10-08 09:34:51.741 9294-9294/com.xhs.mvvm D/李桂云: 添加一个配件
2020-10-08 09:34:51.741 9294-9294/com.xhs.mvvm D/李桂云: ##----------------------------------------------##
2020-10-08 09:34:51.741 9294-9294/com.xhs.mvvm D/李桂云: 造一个玩偶
2020-10-08 09:34:51.741 9294-9294/com.xhs.mvvm D/李桂云: 添加一个配件
2020-10-08 09:34:51.741 9294-9294/com.xhs.mvvm D/李桂云: 添加一个颜色
总结
装饰着模式最终要就是装饰类,他及时对原来类进行调用,又是对当前类的额外的功能添加
对原有类的使用,说明我们符合了开闭原则,对外进行扩展,对内进行关闭
但是问题来了!
自从李麻媳妇把玩偶拿出卖!卖的超级好,李麻二哥看到了!眼里面冒光,自己的卖不出去,所以硬着头皮找李麻帮忙,李麻二哥是卖西游记师徒四人 而且颜色各不同,而且配件超级多,这该怎么办啊!,李麻弄了半天,用儿子给这个方法,越弄越麻烦,然后又给儿子打电话,儿子说 种类多了 就应该用组装模式,儿子就简单说一句,说赶紧上课,等下课了 在说怎么弄!李麻觉得还是上大学了儿子脑子就是比自己好时!下节说说组装模式 怎么解决李麻二哥的问题。
网友评论