面向抽象编程
面向抽象编程与面向接口编程相似,都是不直接面向具体的类,这样有利于扩展。在这里有个例子,用户想要计算一个柱形的体积,但这个柱形的底面形状是不确定的,那么如何在底面形状不确定的情况下完成体积的计算呢?这里可以写一个计算底面积的抽象类,利用抽象类去访问不同类型的底面积,然后计算体积时用抽象类与高度相乘就可以达到以不变应万变的目的。
根据这个思路,下边是具体内容:
一、面向抽象编程UML图示
二、面向抽象编程代码
public class Test {
public static void main(String[] args) {
Pillar pillar;
Geometry bottom = null;
pillar = new Pillar(bottom, 10);
System.out.println("没有底的柱体体积:" + pillar.getVolume());
bottom = new Rectangle(12, 22);
pillar = new Pillar(bottom, 58);
System.out.println("地面为长方形的柱体体积:" + pillar.getVolume());
bottom = new Circle(10);
pillar = new Pillar(bottom, 58);
System.out.println("底面为圆形的柱体体积:" + pillar.getVolume());
}
}
abstract class Geometry{
public abstract double getArea();
}
class Circle extends Geometry{
double r;
Circle(double r){
this.r = r;
}
@Override
public double getArea(){
return(3.14 * r * r);
}
}
class Rectangle extends Geometry{
double a, b;
Rectangle(double a, double b){
this.a = a;
this.b = b;
}
@Override
public double getArea(){
return (a * b);
}
}
class Pillar{
//柱类
Geometry bottom;
double height;
Pillar(Geometry bottom, double height){
this.bottom = bottom;
this.height = height;
}
public double getVolume(){
if(bottom == null){
return -1;
}
return bottom.getArea()*height;
}
}