在面向对象编程中,继承是一个强大的工具,但如果使用不当,会带来一个棘手的问题:类爆炸。
就比如说,假设你要开发一个消息通知系统,需要支持不同的消息类型(普通消息、紧急消息)和不同的发送渠道(邮件、短信、App 推送)。
如果用继承来实现,你可能会这样设计:
Message (抽象基类)
├── NormalEmailMessage (普通邮件消息)
├── NormalSmsMessage (普通短信消息)
├── NormalPushMessage (普通推送消息)
├── UrgentEmailMessage (紧急邮件消息)
├── UrgentSmsMessage (紧急短信消息)
└── UrgentPushMessage (紧急推送消息)2 种消息类型 × 3 种发送渠道 = 6 个类。
这还只是个简单的例子。如果产品经理说要加一种「定时消息」类型,再加一个「微信」渠道,你就需要 3 × 4 = 12 个类。每增加一个维度的选项,类的数量就会成倍增长,这就是所谓的「类爆炸」问题。
更麻烦的是,这些类之间会有大量重复代码。比如所有邮件相关的类都要写发邮件的逻辑,所有紧急消息相关的类都要写加 [URGENT] 前缀的逻辑。
桥接模式(Bridge Pattern) 就是用来解决这个问题的。它的核心思想是:把这两个独立变化的维度拆开,让它们各自独立发展,然后通过组合的方式把它们「桥接」起来。