合成复用原则(Composite Reuse Principle)

1 前言

在面向对象的程序设计中,重用一直以来都是我们所追求的目标,这也被认为是面向对象的重要价值。一直以来,面向对象的三大特性之一的继承性,是我们实现了高度的可重用性的重要法宝。然而,继承虽然能够很好地实现重用,但是仍然在很多时候,会引起一些的问题。

2 问题

目前最大的一个问题就是要求在类定义的时候就考虑到未来可能的情况,提供相应的数据和方法,以供扩展类进行重写。这样是不可能考虑到所有情况的,这是因为事物也总是在发展变化的,我们难得有绝对的对未来的预见性。

3 解决方案

为了解决这个问题,我们可以利用复合重用原则,这个原则侧重于通过委派(或叫作代理)来实现重用转发,而不是在父类中定义默认行为。 继承仅用于复合重用原则可帮助我们灵活地管理实施。

4 示例

举例来说,现在有一个手机类 Phone,包括了大量除5G以外的功能。现在5G来了,为了支持5G,我们可以在为 Phone 类添加一个 ConnectTo5G() 方法。这个做虽然可以解决问题,但是在生产的时候,就不得不有两部手机的生产线来生产5G手机和非5G手机。一旦市场需求发生变化,由于生产线的成本较高,生产调整往往不能够及时响应。所以,这时候合成复用原则就起作用了,我们仍然只有一条生成线,但是增加了一个5G连接的模块,如ConnectionModel5G 类。这个类定义与5G相关的所有属性和操作方法,然后将其添加至Phone 的派生类中即可。

5 设计优势

这样设计的好处有以下几点:

  • 降低主类的复杂度(因为很多属性方法被分离出去了)
  • 能够实现所有的5G功能
  • 当5G功能需要变更时,只需修改 ConnectionModel5G
  • 当5G功能不需要时,移除此模块即可(实际上现在的电路板上有很多空着的预留部分)
  • 当需要升级时,如6G来了,只需要替换相应类即可

6 小结

本文通过一个实例介绍了合成复用原则。其核心思想是将一些功能一致的子功能(属性和方法)合成为一个单独的模块(类),然后在主类中调用这个模块即可。复用合成原则能够为需求变更带来很大的设计灵活性,同时也能够有效地降低主类的复杂度,在实际的项目中应该充分利用。

发布了326 篇原创文章 · 获赞 94 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_43145361/article/details/103692577
今日推荐