【相同点】
两个模式都是为了解决子类过多的问题而运用的。
【不同点】
导致子类过多的诱因不同,解决的问题也不同。
【桥接模式】
--------------------------------------------------------诱因-----------------------------------------------------------
多个维度引发类的改变。
桥接模式对象本身不稳定:手机品牌M通信录,即可以从手机品牌的角度进行抽象,也可以从手机软件的角度进行抽象。手机品牌的变更会影响到类的本身,而手机软件的变更也会影响到类的本身,即生成的类有多个维度的变化。
如果再增加一个手机品牌Y通信录,手机品牌Y游戏,以上两种实现方式都会带来子类过多。
--------------------------------------------------------解决办法-----------------------------------------------------
我们用面向对象的思想进行编码时,要想着把变的部分抽象出来。既然多个维度会引发类的改变,那我们就把这些维度抽象出来,通过聚合的方式来构建出一个类。
使用模式后的结构图
桥接模式结构图:
【装饰者模式】
----------------------------------------------------------诱因---------------------------------------------------------
装饰者模式对象自身非常稳定, 只是为了增加新功能/增强原功能。
通常情况下,拓展一个类的功能我们会使用继承的方式来实现,及子类继承父类,并拓展分类中的功能。但继承具有静态特征(即编译时确立),耦合度高(子类与父类的耦合性高,父类的改变会导致子类的改变或不可用),并且随着扩展功能的增多,子类会膨胀。为了扩展建立一个子类,后面想要再扩展再建立一个子类,如此子类变会膨胀。
结构图展示:
---------------------------------------------------------解决办法----------------------------------------------------
我们用面向对象的思想编码时,有一个原则是“聚合组合原则”,即能用聚合、组合的地方就不用继承,因为继承的耦合性很强,父类的改变会直接导致子类的改变甚至是不可用。我们可以将对人装饰的类(即增加的职责)抽象成一个服饰类,使用抽象的服饰类来包装人,以达到了解耦的目的。
装饰模式的结构图