接口和抽象类是编制框架的基础。(一些对接口和类的个人理解)
框架包括方法框架和流程框架。
方法框架
问题:要求编制求数组最大值的泛型方法
分析:从数组拿到最大值,简化就是从两个对象中比较最大值。
- 定义二元比较方法
public interface ILess<T> {
// x < y ?
boolean less(T x, T y);
}
- 定义数组最大值泛型方法
package com.rrz;
public class MyFramework<T> {
public T getMax(T[] ts, ILess<T> iLess) {
// 参数判断
if (ts == null || ts.length == 0) {
return null;
}
if (iLess == null) {
return null;
}
T maxValue = ts[0];
for (int i = 1; i < ts.length; i++) {
if (iLess.less(maxValue, ts[i])) {
maxValue = ts[i];
}
}
return maxValue;
}
}
- 根本不需要实现 ILess 的子类,上述框架就编译成功。
- 框架程序若获得具体应用,则必须实现 ILess 子类。
要使用框架就自己写实现类,自己定义规则
public class IntegerLess implements ILess<Integer>{
@Override
public boolean less(Integer x, Integer y) {
return x < y;
}
}
或者
先定义一个 model
package com.rrz;
public class Student {
private String name;
private Integer grade;
public Student(String name, Integer grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
}
写 ILess 的实现类
package com.rrz;
public class StudentLess implements ILess<Student> {
@Override
public boolean less(Student x, Student y) {
return x.getGrade() < y.getGrade();
}
}
测试类省略
流程框架
问题:求圆、矩形的面积。要求:求圆面积时能输入圆的半径,求矩形面积时,能输入长、宽。
分析:对不同的形状有不同的输入参数,有不同的求面积方法。“输入”和“求面积”是并列关系。用接口来定义“输入”及“求面积”功能最合适。
public interface IShape {
// 输入
boolean input();
// 求面积
float getArea();
}
public class ShapeProc {
private IShape shape;
public ShapeProc(IShape shape) {
this.shape = shape;
}
public float process() {
// 输入
shape.input();
// 求面积
float area = shape.getArea();
return area;
}
}
可以发现:
- 根本无需实现 IShape 子类,上述流程框架即可编译成功。
- 流程框架若获得具体应用,则必须实现 IShape 的子类。
结论:
框架编程原则:面向接口、抽象类进行编程。只要接口和抽象类是稳定的,一般可以抛开具体的实现类进行编程,容易形成一个稳定的框架系统。