菜鸟有句话想说:“加不加班的不重要,我只是比较喜欢晚上公司门口的路灯。”
今天跟大家分享一下,设计模式七大原则中的“合成复用原则”。该原则阐述的是,我们应该如何复用类。
讲“合成复用原则”之前先来聊一聊类的“复用”。复用类我们可以通过“继承”和“合成”两种方式来实现。
这两种方式中,“继承”相信大家都比较了解,我们就先看一下继承的优缺点。
继承的优点:
容易实现并且容易修改和扩展继承来的内容。
继承的缺点:
它最大的缺点就是增加了类之间的依赖,当父类发生改变时,其子类也会被动发生改变。并且子类继承来的实现是静态的,在代码编译时期已经定义好的,在运行时是不可以发生变化的。
还有就是继承是属于“白箱”复用,父类对子类来说是透明的,这破坏了类的封装性。
介于继承存在的这些缺点,我们在复用类时,要优先考虑使用“合成”进行复用。
合成复用简介:
1、合成复用原则的核心思想是:在编写代码时如果需要使用其它类,那么两个类之间尽量使用合成/聚合的方式,而不是使用继承。
2、合成复用原则,传递的一种设计思路就是:我们可以通过类之间的“合成”来达到“复用”代码的诉求。
合成复用的好处就是解决了使用继承带来的缺点,我就不在此进行赘述。
任何事物有好就有坏,这是必然的。合成复用存在的缺点就是在系统中会存在较多的对象需要管理。
还有一点需要注意:不是不使用继承,而是尽量先考虑使用“合成”复用,其次在考虑使用“继承”复用。
说了这么多“合成复用原则”的理论性知识,那到底我们应该怎样应用在代码中呢?请看下面的示例。
案例:假设有A、B两个类。B类需要复用A类的方法。
通过“合成复用原则”来实现上述案例(不再展示继承复用)。
方式一: 使用简单依赖。在B类中添加方法,方法入参使用A类。
// 测试类
public class Test {
public static void main(String[] args) {
B b = new B();
b.methodB(new A());
}
}
// A类
class A {
public void methodA() {
System.out.println("A类的方法执行了。");
}
}
// B类
class B {
public void methodB(A a) {
System.out.println("B类的方法执行了。");
a.methodA();
}
}
使用“简单依赖”的执行结果:
方式二: 把A类聚合到B类中。在B类中添加属性,类型为A类,通过set方法进行初始化。
// 测试类
public class Test2 {
public static void main(String[] args) {
B b = new B();
System.out.println("使用聚合的执行结果:");
b.setA(new A());
b.methodB();
}
}
// A类
class A {
public void methodA() {
System.out.println("A类的方法执行了。");
}
}
// B类
class B {
private A a;
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public void methodB() {
System.out.println("B类的方法执行了。");
this.a.methodA();
}
}
使用“聚合”的执行结果:
方式三: 把A类组合到B类中。在B类中添加属性,类型为A类,并直接new出来。
public class Test3 {
public static void main(String[] args) {
B b = new B();
System.out.println("使用组合的执行结果:");
b.methodB();
}
}
class A {
public void methodA() {
System.out.println("A类的方法执行了。");
}
}
class B {
private A a = new A();
public void methodB() {
System.out.println("B类的方法执行了。");
this.a.methodA();
}
}
使用“组合”的执行结果:
以上就是使用“合成复用原则”的一些基本知识。切记合成复用原则向我们传达的设计理念是:优先考虑使用“合成”复用,其次在使用“继承”,并不是不使用“继承”。 继承也是有其优点的。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。