1、简介
尽量使用对象组合/聚合, 而不是继承关系达到软件复用的目的。
什么意思呢,就是使用代码实现功能的时候。尽量的使用对象组合的形式,不要采用继承等方式。
比如我们有老师和学生,老师有一个方法是讲课,学生也可以去讲课,用继承的方式我们很好理解。
那么老师有啥学生有啥,老师变啥学生也要变啥,这就导致学生和老师之间有一定的耦合性。
那倘若我既想要老师的方法,又不想被他完全束缚,怎么办呢。
那就建一个老师的对象,通过老师的实例对象来调用他的方法,这样,即使以后他的方法修改了,那学生也不需要进行更改。顶多不在调用这个方法,而不会出现继承已有方法出错的情况。
2、实例简介
1) 我们先建立一个老师类
package myapplication.lum.com.bird;
import android.util.Log;
public class Teacher {
private String TAG = "TAG_teacher";
public void lecTure(){
Log.i(TAG,"讲课");
}
}
2) 在建立一个学生类
package myapplication.lum.com.bird;
import android.util.Log;
public class Student {
private String TAG = "TAG_Strudent";
private Teacher teacher ;
public void lecTure(Teacher teacher){
Log.i(TAG,"lecTure");
this.teacher = teacher;
this.teacher.lecTure();
}
}
3) 在主程序里调用学生讲课
package myapplication.lum.com.bird;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Student student = new Student();
Teacher teacher = new Teacher();
student.lecTure(teacher);
}
}
log:
由于合成或聚合可以将已有对象纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能。这样做的好处有
(1) 新对象存取成分对象的唯一方法是通过成分对象的接口。
(2) 这种复用是黑箱复用,因为成分对象的内部细节是新对象看不见的。
(3) 这种复用支持包装。
(4) 这种复用所需的依赖较少。
(5) 每一个新的类可以将焦点集中到一个任务上。
(6) 这种复用可以再运行时间内动态进行,新对象可以动态地引用与成分对象类型相同的对象。
一般而言,如果一个角色得到了更多的责任,那么可以使用合成/聚合关系将新的责任委派到合适的对象。当然,这种复用也有缺点。最主要的缺点就是通过这种复用建造的系统会有较多的对象需要管理。