合成複用原則
CRP / Composite Reuse Principle
尚矽谷設計模式-學習筆記
----------------合成複用原則簡單介紹
合成複用原則,就是盡量使用依賴/合成/聚合的方式,而不是使用繼承。
----------------合成複用原則執行個體
執行個體簡介:
建立一個A類和B類,B類需要使用A類中的2個方法method1,method2
Example:傳統統方法(通過繼承)
public class CRP1 {
public static void main(String[] args) {
B b = new B();
b.method1();
b.method2();
}
}
//通過B類繼承A類,使B類能夠調用A類的方法
class A{
public void method1() {
System.out.println("method1");
}
public void method2() {
System.out.println("method2");
}
}
class B extends A{
}
這種方法的問題:
B類需要用到A類的方法,不代表兩者必須要有繼承的關系。有可能兩者基本沒有什麼聯系。
而且如果我們在A類添加一些新的方法,而B類隻需要使用A類中的method1和method2,B類就會繼承一些它不需要用到的方法。
解決方法:
通過依賴,聚合,組合的方法來讓B類無需繼承A類,又能夠調用A類的方法。
Example:改進方法1(使用類的依賴)
public class CRP2_dependency {
public static void main(String[] args) {
A a = new A();
B b = new B();
b.method1(a);
b.method2(a);
}
}
class A{
public void method1() {
System.out.println("method1");
}
public void method2() {
System.out.println("method2");
}
}
//B依賴A調用方法1和方法2
class B {
public void method1(A a) {
a.method1();
}
public void method2(A a) {
a.method2();
}
}
Example:改進方法2(使用類的聚合)
public class CRP2_aggregation {
public static void main(String[] args) {
B b = new B();
b.setA(new A());
b.method1();
b.method2();
}
}
class A{
public void method1() {
System.out.println("method1");
}
public void method2() {
System.out.println("method2");
}
}
//B類與A類聚合
class B {
A a;
public void setA(A a) {
this.a = a;
}
public void method1() {
a.method1();
}
public void method2() {
a.method2();
}
}
Example:改進方法3(使用類的組合)
public class CRP2_composition {
public static void main(String[] args) {
B b = new B();
b.method1();
b.method2();
}
}
class A{
public void method1() {
System.out.println("method1");
}
public void method2() {
System.out.println("method2");
}
}
//B類與A類組合,直接在B建立的時候建立了一個A。
//這樣就可以在B類中直接調用
class B {
A a = new A();
public void method1() {
a.method1();
}
public void method2() {
a.method2();
}
}