一、基本介绍
尽量使用合成/聚合的方式,而不是使用继承
二、应用实例
此处有两个类,A类和B类,然后我们接到一个需求,需要在B类中使用到A类的方法
解决方案1:直接让B类继承A类
代码实现:
1 public class A { 2 void operation1(){ 3 //do something... 4 } 5 6 void operation2(){ 7 //do something... 8 } 9 } 10 11 class B extends A{ 12 @Override 13 void operation1() { 14 super.operation1(); 15 } 16 17 @Override 18 void operation2() { 19 super.operation2(); 20 } 21 }
分析:如果只是让B类去使用A类中的方法,使用继承就会让B类和A类之间的耦合性增强(一旦A类发生任何变动就会影响到B类),可以使用合成/聚合的方式替代继承
解决方案2:让A类作为B类方法的参数来实现依赖关系
代码实现:
1 public class A { 2 void operation1() { 3 //do something... 4 } 5 6 void operation2() { 7 //do something... 8 } 9 } 10 11 class B { 12 void operation1(A a) { 13 a.operation1(); 14 a.operation2(); 15 } 16 }
解决方案3:将A类的实例作为B类的成员变量来实现聚合关系
代码实现:
1 public class A { 2 void operation1() { 3 //do something... 4 } 5 6 void operation2() { 7 //do something... 8 } 9 } 10 11 class B { 12 private A a; 13 14 public void setA(A a) { 15 this.a = a; 16 } 17 }
解决方案4:将A类在B类中实例化来实现组合关系
代码实现:
1 public class A { 2 void operation1() { 3 //do something... 4 } 5 6 void operation2() { 7 //do something... 8 } 9 } 10 11 class B { 12 A a = new A(); 13 }
三、设计原则的核心思想
(1)找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
(2)针对接口编程,而不是针对实现编程
(3)为了交互对象之间的松耦合设计而努力