设计模式之装饰模式与继承对比

文章通过买车配置的例子解释了装饰模式与继承的区别。装饰模式在需要动态组合功能时更为灵活,避免了因大量功能组合导致的子类爆炸问题,但可能产生更多对象,增加查错难度。继承则是静态的,适合功能固定的扩展。当面临多种可选功能时,装饰模式提供了更优雅的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在整理设计模式,由于本人以前只了解过单例模式和工厂模式,所以整理起来相对困难。

当看到装饰模式时一直在想,既然继承可以实现对基类的扩展,为何还要装饰模式?

装饰模式和继承是各有优缺点的。

现在想象一下,假设你要去买一辆车,现在的车功能普遍很多,什么座椅加热,方向盘加热,自适应巡航,主动刹车,隐藏式门把手,全景天窗等等。假设你可以选配的功能一共有10种,想象一下如何用继承来实现不同的功能搭配选择:有的人只买丐版,有的人买顶配,有的人只选配座椅加热功能,有的人只要自适应巡航功能,有的人要两三种功能。每一种不同的功能组合,都需要定义一个相应的子类来实现,想包含所有的配置选择就需要定义很多子类。

但是如果用装饰模式,只需要将这10种配置每一种配置定义一个装饰类即可。现在一辆车造出来了,你想选择自适应巡航功能,则通过自适应巡航类装饰一下,如果再想加上全景天窗功能,则再通过全景天窗类装饰一下即可,可以  动态地  搭配

总结这个例子就是:

去4s店买车,4s店的车都是已经成型的,无法动态地增加配置,所以4s店里需要摆放多种配置的车(不同的子类)以供顾客挑选。

而去工厂买车,最开始只有一个发动机和一个车架子,你自己要什么功能就往上加什么功能,这是动态地添加。

这下我觉得大家对于装饰模式和继承的区别就一目了然啦。

然后说下装饰模式和继承的优缺点:

(1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。

(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

个人感觉就是:当有大量的功能可以选配时,继承实现会导致代码过于臃肿,而使用装饰模式的话,当某个实例选配过多时则会导致创建过多对象,导致差错困难等一系列问题。

装饰模式的缺点

由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。

然后装饰模式的具体实现网上已经很多教程了,这里就不赘述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值