例题:教育局的学校管理中包括小学、初中和高中等三个级别老师与学生
不使用组合复用原则的解法; 代码实现:
//采用继承实现 class Person{ } class Teachers extends Person{} class Students extends Person{} //小学教师 class PrimmarySchoolTeacher extends Teachers{} //初中教师 class JuniorSchoolTeacher extends Teachers{} //高中教师 class HighSchoolTeacher extends Teachers{} //小学生 class PrimmaryStudent extends Students{ public void say() { // TODO Auto-generated method stub System.out.println("我是小学生"); } } //初中生 class JuniorStudent extends Students{ public void say() { // TODO Auto-generated method stub System.out.println("我是初中生"); } } //高中生 class HighStudent extends Students{ public void say() { // TODO Auto-generated method stub System.out.println("我是高中生"); } } public class Demo1 { public static void main(String[] args) { //输出测试代码 } }
组合复用原则的概念 优先使用对象组合(聚合),而不是继承来达到复用的目的 使用组合复用原则的解法: 代码实现:
//采用组合复用原则实现 abstract class Person{ private String name; private SchoolLevel level;//学校层次与人事关系(组合) public Person(String name,SchoolLevel level){ super(); this.name = name; this.level = level; } public SchoolLevel getLevel(){ return level; } public void setLevel(SchoolLevel level){ this.level = level; } } //教师类 class Teacher extends Person{ public Teacher(String name,SchoolLevel level){ super(name,level); } public void say(){ System.out.println(super.getName()+"是"+super.getLevel()+"老师"); } } //学生类 class Student extends Person{ public Student(String name,SchoolLevel level){ super(name,level); } public void say(){ System.out.println(super.getName()+"是"+super.getLevel()+"学生"); } } //学校层次 interface SchoolLevel{ String getLevel(); } //小学 class PrimaryLevel implements SchoolLevel{ @Override public String getLevel(){ return "小学"; } } //初中 class JuniorLevel implements SchoolLevel{ @Override public String getLevel(){ return "初中"; } } //高中 class SenioLevel implements SchoolLevel{ @Override public String getLevel(){ return "高中"; } } //后勤人员 class Logistics extends Person{ public Logistics (String name,SchoolLevel level){ super(name,level); } } //测试 public class Demo{ public static void main(String[] args){ SchoolLevel Level =new SenioLevel();//高中 Student swk = new Student("孙悟空",level); swk.say(); } }
运行截图: