Java 中的组合复用原则(Composite Reuse Principle,CRP) 是面向对象设计中的一条重要原则,通常表述为:
尽量使用对象组合(composition)/聚合(aggregation),而不是继承(inheritance)来实现代码复用。
它是 面向对象设计原则 的一部分,有时也被视作对“继承复用”的一种约束。
在 Java 中,复用代码常见有两种方式:
class A {
public void method() {}
}
class B extends A {
// 直接复用 A 的方法
}
问题:
class A {
public void method() {}
}
class B {
private A a = new A();
public void doSomething() {
a.method();
}
}
优点:
✅ 优先使用“has-a”关系,而不是“is-a”关系
| 方式 | 关系 | 说明 |
|---|---|---|
| 继承 | is-a | 子类是父类的一种 |
| 组合 | has-a | 类拥有另一个类的能力 |
class Engine {
void start() {}
}
class Car extends Engine {
}
❗ 问题:Car 并不是一种 Engine
class Engine {
void start() {}
}
class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
void start() {
engine.start();
}
}
✅ 更符合现实模型和设计原则
✅ 组合优先,但 不是绝对禁止继承
适合使用继承的情况:
例如:
class Animal {}
class Dog extends Animal {}
组合复用原则常与 依赖注入(DI) 一起使用。
Java 组合复用原则:能用组合,就别用继承;组合更灵活,继承要谨慎。
如果你愿意,我也可以用 Spring / 实际项目例子 或 UML 图 来进一步说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。