天天看點

【設計模式筆記】合成複用原則

合成複用原則

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();
    }
}
           

繼續閱讀