【设计模式笔记】合成复用原则

合成复用原则

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

你可能感兴趣的:(设计模式学习笔记)