课程名称:Java全栈工程师
课程章节:阶段二:Java 编程思想深度理论知识
课程讲师:7七月
课程内容:Java 编程思想历程
首先是最基本的面向对象开始吧,Java 编程无时无刻不在用到对象,在 Java 的世界里万物皆对象,我们在用到对象前“必须”要创建这个对象才能使用。比如 Spring Framework 大部分时间都是在对象上做文章
最烂大街的办法就是直接 new 对象,同时也是最简单的方式。就相当于我是买生煎包的老板,客户要一个生煎包我就现做一个,要一个就再做一个。一个是从 JVM 的角度来看,这样操作也是很费内存的,同时频繁创建和销毁对象,触发内存回收机制也不是明智的选择,要是这样做生意,不是没赚到钱就是活活累死。从设计的角度思考,不优雅啊!new 是 Java 最基础的语法,体现不出编程水平的东西,当然了,new 一个对象的过程需要好好去探究探究,但不是现在要说的这事
接口、抽象类统一方法调用
这里要先说下设计模式里的开闭原则(OCP,Open Closed Principe),这些设计模式是前人不断实践和总结出适用于面向对象思想的好的思想。一般来说,我们编程都差不多也是要遵循这些设计模式去编码,其中最基本的原则就是开闭原则,**类、函数、模块应该对拓展开放(对提供方),对修改关闭(对使用方),用抽象构建框架,用实现拓展细节,而不是通过修改原来的代码实现变化**。不改原代码,做到兼容的效果,不过这个拓展还是得好好琢磨琢磨,curd 的 boy 笑了,再复制粘贴一份,改一改不就行了,当然也是一种可以解决问题的办法,倘若要增加几十份、几百份,那重复功能的代码可就要“爆炸”了,代码臃肿,功能单一,不优雅。
现在有个 Java 课程(JavaCourse),有名称(name)和价格(price)属性,但是后面课堂增加了别的课程,怎么办?再复制粘贴改成 Spring 课程、Python 课程吗?
刚刚说到了,其实问题就是重复功能的代码很多,那么把相同的功能抽象出来,弄成抽象类或者接口不就好了。到这,终于看到了使用编程思想去解决问题的一点光亮。**接口、抽象类可以很好地统一方法调用**,提炼出功能的共性,拓展类实现(接口)或继承(实现类)这些抽象出来的接口、抽象类
先有个大致思路:
Java 课程、Spring 课程、Python 课程都是“课程”,那么把“课程”提炼成一个接口 ICourse 对外提供 getName() 和 getPrice() 的获取方法,Java 课程(JavaCourse)就实现 ICourse 接口。
```java
public interface ICourse {
String getName();
String getPrice();
}
```
```java
public class JavaCourse implements ICourse {
@Override
public String getName() {
return "Java Course";
}
@Override
public String getPrice() {
return "666";
}
}
```
```java
public class PythonCourse implements ICourse {
@Override
public String getName() {
return "Python Course";
}
@Override
public String getPrice() {
return "999";
}
}
```
这时再来个需求变更,Java 课程打折了,就会产生一个折扣价 discountPrice,怎么办?那就加一个 JavaDiscountCourse 类去继承 JavaCourse,继承了 JavaCourse 的原名称和原价格,但是这个是原价,不是折扣价。因为 JavaDiscountCourse 本来就是拓展的类,再增加一个获取原价的方法 getOriginalPrice()
```java
public class JavaDiscountCourse extends JavaCourse {
String price; // 折扣价
public String getOriginalPrice() {
return super.getPrice();
}
}
```
工厂模式统一对象创建&反射通过Class创建对象
看到这里,还没完,记得最早说的创建对象才是重点,JavaCourse、PythonCourse 是具体类,要使用它们还是得 new。所以兜兜转转是又回到起点?正如前面所述,接口、抽象类统一方法的调用,那么创建对象是否也可以统一起来。这就要说到设计模式的工厂模式了
工厂模式统一对象创建
反射通过Class创建对象
课程收获:
一步一步体会到面向对象思想的提炼,自己平时写的业务代码很少用到设计模式,反思下,可以把功能单一,但代码使用频繁的抽象封装,既可以拓展,又可以兼容的那种,提升自己的编程水平
共同学习,写下你的评论
评论加载中...
作者其他优质文章