论坛模板网站建设,阿里云注册网站之后怎么做网站,wordpress 自动加版权,哪些网站是vue做的文章目录前言一、什么是面向抽象编程#xff1f;二、传统场景的类设计2.1、项目场景设计2.2、传统类设计存在的问题三、采用面向抽象编程的类设计3.1、设计一个抽象类/接口3.2、采用上转型对象/接口回调调用子类方法3.3、重新设计子类/被实现类3.4、面向抽象编程的具体实现四、…
文章目录前言一、什么是面向抽象编程二、传统场景的类设计2.1、项目场景设计2.2、传统类设计存在的问题三、采用面向抽象编程的类设计3.1、设计一个抽象类/接口3.2、采用上转型对象/接口回调调用子类方法3.3、重新设计子类/被实现类3.4、面向抽象编程的具体实现四、面向抽象编程的优势总结前言 面向抽象原则是面向对象四大基本原则的第一条其重要性不言而喻面向抽象原则分为抽象类、接口以及面向抽象编程在之前的内容中我们详细介绍了抽象类与接口并对二者进行了对比在本文中我们将详细介绍什么是面向抽象编程它与传统编程相比有什么优势在开发中又该如何切实应用。 一、什么是面向抽象编程
面向抽象编程就是在设计一个类时不让该类面向具体的类而是面向抽象类或接口即所设计的类中的重要数据是抽象类或接口声明的变量而不是具体类声明的变量。
下面我们将在具体的案例中进一步分析传统类设计与面向抽象编程的类设计的区别。
二、传统场景的类设计
在探讨面向抽象编程之前先看一下我们常规对于一个类的设计是什么样的。
2.1、项目场景设计
项目场景现在我们需要求一个圆柱体的体积需要创建两个类圆类 Circle 和圆柱体类 Pillar。
首先我们创建一个 Circle 类该类创建的对象 circle 调用 getArea() 方法可以计算出圆的面积Circle 类的代码如下
package com.bailu.principle;public class Circle {final double PI 3.14159;// 定义一个常量double r;/** 定义一个无参构造*/Circle() {}Circle(double r) {this.r r;}public double getArea() {return (PI * r * r);}
}接着我们再设计一个圆柱类 Pillar该类创建的对象 pillar 调用 getVolume() 方法可以计算圆柱体的体积Pillar 类的代码如下
package com.bailu.principle;public class Pillar {Circle bottom;// 将Circle类声明的对象作为成员圆柱体的底double height;/** 定义一个无参构造*/Pillar() {}Pillar(Circle bottom, double height) {this.bottom bottom;this.height height;}public double getVolume() {return bottom.getArea() * height;}
}2.2、传统类设计存在的问题
在上面的圆柱体类 Pillar 中bottom 是用具体类 Circle 声明的变量如果在实际开发中不涉及用户需要的变化这样设计并没有什么不妥但是某些时候如果用户希望将圆柱体改为三菱柱。显然 Pillar 类是无法满足的并不能满足用户的需求。
那我们就需要对 Pillar 类进行修改。对于需要我们需要明确柱体计算体积关键点在于计算底面积。我们不应该关心它的底具体是什么样的形状而应该关心是否有计算面积的方法。
即我们在设计类的时候不应该将柱体的底看做某个具体类声明的变量我们上面这样做Pillar 类太过于依赖具体类缺乏弹性难以应对需求的变化。
三、采用面向抽象编程的类设计
3.1、设计一个抽象类/接口
如果我们采用面向抽象编程重新进行设计首先需要设计一个抽象类用来获取柱体底面积该抽象类或接口我们定义为 Geometry()我们在其中定义一个 getArea() 的抽象方法具体代码如下
package com.bailu.principle;public abstract class Geometry {// 如果使用的是接口用interface定义即可public abstract double getArea();
}现在我们就可以面向 Geometry 类进行编码即通过上转型对象/接口回调的方式调用 Geometry 子类重写的 getArea() 方法这样 Pillar 类就可以将计算柱体底面积的任务指派给 Geometry 子类的实例。
3.2、采用上转型对象/接口回调调用子类方法
现在我们重新设计 Pillar 类不再依赖具体类而是面向我们创建的抽象类/接口 Geometry即 bottom 不再是具体类 Circle 声明的变量重新设计后 Pillar 类代码如下
package com.bailu.principle;public class Pillar {Geometry bottom;// bottom是抽象类Geometry声明的变量double height;/** 定义一个无参构造*/Pillar() {}Pillar(Geometry bottom, double height) {this.bottom bottom;this.height height;}public double getVolume() {return bottom.getArea() * height;// bottom可以调用子类重写的getArea()方法}
}3.3、重新设计子类/被实现类
在采用面向抽象编程之后我们就可以根据客户需求对柱体要求的不同底进行设计。如圆形底和矩形底我们创建抽象类 Geometry 的子类 Circle 和 Rectangle重写 Geometry 类的抽象方法 getArea()计算各自面积。
Circle 类对应代码如下
package com.bailu.principle;/** 当柱体的底为圆时*/
public class Circle extends Geometry {final double PI 3.14159;// 定义一个常量double r;/** 定义一个无参构造*/Circle() {}Circle(double r) {this.r r;}Overridepublic double getArea() {return (PI * r * r);}
}Rectangle 类对应代码如下
package com.bailu.principle;/** 当柱体的底为矩形时*/
public class Rectangle extends Geometry {double a, b;// 定义矩形的长宽/** 创建一个无参构造*/Rectangle() {}Rectangle(double a, double b) {this.a a;this.b b;}Overridepublic double getArea() {return a * b;}
}3.4、面向抽象编程的具体实现
现在我们就可以使用 Pillar 类创建出不同形状底的柱体了实现代码如下
package com.bailu.principle;public class ApplicationPillar {public static void main(String[] args) {Pillar pillar;Geometry bottom;bottom new Rectangle(2, 3);// 抽象类的实例作为Rectangle类的上转型对象pillar new Pillar(bottom, 3);System.out.println(矩形底柱体体积为 pillar.getVolume());bottom new Circle(2);// 抽象类的实例作为Circle类的上转型对象pillar new Pillar(bottom,2);System.out.println(圆底柱体体积为 pillar.getVolume());}
}运行结果具体如下图所示 四、面向抽象编程的优势
通过上面的案例我们可以发现采用面向编程来设计 Pillar 类使得 Pillar 类不再依赖于具体的某个类Circle 类、Rectangle 类当我们有新的需求增加时我们只需要增加 Geometry 的子类即可如增加一个三角形底的子类 Triangle并不需要修改 Pillar 类的任何代码就可以创建出三角形底的柱体。 总结 在本文给大家介绍了什么是面向抽象编程并通过与传统类设计的对比使大家明确面向抽象编程的优势设计一个类时不让该类面向具体的类而是面向抽象类或接口即所设计的类中的重要数据是抽象类或接口声明的变量而不是具体类声明的变量这样就算需求发生变化我们只需要增加或修改抽象类子类内容即可而无需修改其他代码。 我是白鹿一个不懈奋斗的程序猿。望本文能对你有所裨益欢迎大家的一键三连若有其他问题、建议或者补充可以留言在文章下方感谢大家的支持