接口特性
案例
思路:
首先应该建立整体大框架:应该先创建一个学生类,里面标明学生的各项属性:姓名、性别、成绩。要打印全班学生的信息,需要一个班级类,在里面创建Arraylist容器包含全体学生数据。然后在里面定义打印学生信息和平均成绩的方法。本题的关键在于有两种实现方案并要求灵活切换,那么可以定义一个学生操作接口,定义两个实现类,分别实现两种方案。需要切换方案的时候只需要修改使用的那个实体类就可以了。
代码:
先写一个学生类,定义无参有参构造器,以及get / set等方法:
public class Student {
private String name;
private char sex;
private double score;
public Student() {
}
public Student(String name, char sex, double score) {
this.name = name;
this.sex = sex;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
定义一个班级类,包含班级所有学生信息:
public class ClassManager {
private ArrayList<Student> students = new ArrayList<Student>();
public ClassManager(){
students.add(new Student("The shy",'男',100));
students.add(new Student("xiaohu",'男',95.5));
students.add(new Student("yangzi",'女',80));
students.add(new Student("shiba",'女',99.0));
students.add(new Student("chengcheng",'女',88));
}
public void print(){
//StudentsOperator s = new printSelect();
//s.printInfo(students);
//s.printScore(students);
}
}
接下来就是实现打印信息和打印成绩的函数了,因为有2种方案,所以先实现一个接口和2个对应的实现类:
接口定义为StudentsOperator:
public interface StudentsOperator {
void printInfo(ArrayList<Student> students);
void printScore(ArrayList<Student>students);
}
两个实现类:
实现类PrintAll:
public class printALL implements StudentsOperator{
@Override
public void printInfo(ArrayList<Student>students) {
System.out.println("-----------全部学生信息如下-------------");
for (int i = 0; i < students.size(); i++) {
System.out.println(students.get(i).getName()+" "+students.get(i).getSex()
+" 的成绩是 "+students.get(i).getScore());
}
}
@Override
public void printScore(ArrayList<Student>students) {
double sum = 0;
for (int i = 0; i < students.size(); i++) {
sum += students.get(i).getScore();
}
System.out.println("平均成绩是 "+sum / students.size());
}
}
实现类PrintSelect:
public void printScore(ArrayList<Student>students) {
double sum = 0;
double max = 0,min = 100;
for (int i = 0; i < students.size(); i++) {
if(students.get(i).getScore() > max) max = students.get(i).getScore();
if(students.get(i).getScore() < min) min = students.get(i).getScore();
sum += students.get(i).getScore();
}
System.out.println("平均成绩是 "+
String.format("%.2f",(sum-max-min) / (students.size()-2)));
}
}
这样整体框架就搭建好了,下面如何切换方案呢?————在ClassManager类Print方法中,分别用实现类创建对象。我们知道:一个接口可以被多个实现类实现,这样实现出的接口可以很方便地切换实现类,因为不同实现类中有不同的重写方法对接口中的抽象方法进行了重写,所以这样就可以调用不同的方法完成切换业务。
实验
在Test类中创建ClassManager对象,调用Print方法:
public class Test {
public static void main(String[] args) {
ClassManager clas = new ClassManager();
clas.print();
}
}
先来看一下方案一(打印所有学生信息和平均分):
再看一下方案二(打印男女人数,去掉最高分最低分的平均成绩):
切换方法————只需要将实现类printAll 换成 printSelect就可以了,其他不用改,是不是很方便