一、面向对象

面向对象是Java编程中最核心的思想,基本特征:继承、封装、多态。

1、特征之封装

将结构、数据、操作封装在对象实体中,使用时可以不关注对象内部结构,只能访问开放权限的功能入口,从而降低程序耦合程度,提供安全性和可持续维护性。

public class Concept01 { public static void main(String[] args) { Student student = new Student("张三","高三",29f); student.conclusion(); } } class Student { private String name ; private String grade ; private Float score ; public Student(String name, String grade, Float score) { this.name = name; this.grade = grade; this.score = score; } public void conclusion (){ System.out.println("姓名:" this.getName()); System.out.println("年级:" this.getGrade()); System.out.println("分数:" this.getGrade()); if (this.getScore() >= 100.0f){ System.out.println("评语:本学期优等生"); } else { System.out.println("评语:本学期潜力股"); } } }

案例描述Student的学期总结,通过构造方法构建具体的学生对象,并且只通过conclusion方法获取学生学期评价。

2、特征之继承

子类除了提供自身的能力之外,还可以通过继承的方式获取父类开放的属性和方法,以增强自身的功能。

public class Concept02 { public static void main(String[] args) { // 判断 Digital 是 Phone 父类 System.out.println(Digital.class.isAssignableFrom(Phone.class)); } } class Digital {} class Phone extends Digital{}

这里通过isAssignableFrom方法判断Digital是Phone父类。

3、特征之多态

不同主体类对同一个动作给出不同的实现方式,多态也是Java描述设计模式的常用手段,最直接的作用就是程序解耦。

public class Concept03 { public static void main(String[] args) { Animal animalDog = new Dog(); Animal animalCat = new Cat(); animalDog.voice(); animalCat.voice(); } } class Animal { public void voice () { System.out.println("Animal ... voice"); } } class Dog extends Animal { @Override public void voice() { System.out.println("Dog ... Wang wang"); } } class Cat extends Animal { @Override public void voice() { System.out.println("Cat ... Meow meow"); } }

通常动物都有发出声音的能力,但是不同动物声音不同,这里基于多态实现,不同动物的声音特征。

二、关系图谱

在了解面向对象之后,还需要理解一下基础的关系模型,在实际的业务中都是基于这些基础的关系解决场景问题。

1、继承与实现

继承关系:强调属性和方法从父类向子类的传承。实现关系:强调描述抽象和具体实现的逻辑。

/** * 继承 */ class classA {} class classB extends classA {} interface interfaceA {} interface interfaceB extends interfaceA {} /** * 实现 */ class classC implements interfaceA,interfaceB{}

如何更好的理解java面向对象(Java进阶从整体上观察面向对象)(1)

2、依赖与关联

依赖关系:常用来描述方法局部变量或者入参,即类的方法中调用了另一个类。关联关系:类的成员变量是另一个类,比如常见的一对一,一对多关系。

/** * 依赖 */ class RelyA {} class RelyB { public void depend (RelyA rely){} } /** * 关联 */ class AssociateA {} class AssociateB { private AssociateA associateA ; }

如何更好的理解java面向对象(Java进阶从整体上观察面向对象)(2)

3、组合与聚合

聚合关系:描述整体与部分的关系,但是部分不需要依赖整体存在。组合关系:描述整体与部分的关系,但是部分需要依赖整体存在。

/** * 聚合 */ class ElementA {} class ElementB {} class Aggregation { private ElementA elementA ; private ElementB elementB ; } /** * 组合 */ class PortionA{} class PortionB{} class Composition { private PortionA portionA ; private PortionB portionB ; }

如何更好的理解java面向对象(Java进阶从整体上观察面向对象)(3)

三、模式与原则

在面对复杂业务时,可以时常参考设计模式和基本原则,以此设计合理的业务结构,实现代码的高内聚低耦合,但是在一些特定场景下,也要果断的突破这些模板或原则,可以更好的支撑业务。

1、设计模式

创建模式

抽象对象实例化的创建过程,对不同类型的对象提供高效的管理方式与合理的创建手段。

结构模式

设计类的组装模式,合理的对象结构,有利于支持业务的持续迭代,结构会直接影响代码的可持续维护性。

行为模式

行为模式涉及对象职责定义,通信协作,和最具体的业务逻辑实现,明确程序运行时的流程轨迹。

可以基于继承或实现的方式控制不同类的行为职责,即顶层抽象控制行为,下层逐级做具体逻辑实现;或者直接聚合管理责任对象,做统一分配。

2、基本原则四、业务应用

在业务开发中,很多复杂的逻辑都是基于面向对象的思想做的设计和具体实现,但是在实际上业务是不断变化的,所以不管是常用的Mvc模式,或者领域设计,只要经过多个版本迭代,多人参与的开发,到最后代码在逻辑层面都会让人着迷。

也就是常说的一种现象:新人重构,老人不断修复问题,然而铁打的问题,流水的开发,但凡经历过重构的同学都知道,所谓的大规模重构很难彻底解决问题,甚至这是个循环动作。所以业务代码更多是在那个版本周期内是合理的,站在一个开发的角度,这里也可以理解为笔者个人角度,通常从下面几个角度去思考具体的业务开发:

这是个人认为业务工程中最重要的基础,不管业务如何复杂,都离不开与之相应的数据增删改查,所以对常规基础操作做好统一代码风格管理,这样有助于别人快速理解整体结构和逻辑。

这里风格指:接口命名,参数,组件,中间件等统一,以持久层为例,避免多个组件混用的情况,如果是周期相对较长的项目,经常看到单是分页查询的实现逻辑都有多种情况。

易变是业务本身的特点,所以高度复用的业务代码本身就存在很大的限制,例如常见的很多方法,为了适配各种场景,不断扩展入参,然后有些特殊业务也会进行特殊传参。

还有一些开发常说的,能用一个接口实现,绝对不使用两个接口,看似很有个性,实际已经走在挖坑的路上,多个功能请求同一个接口,即意味着任何接口的改动都要考虑很多逻辑的适配。

所以从上层向下看,不必过度考虑复用,从下向上看,底层的改动相对较少,应该考虑复用。

从项目生命周期的角度思考,业务是一个迭代的过程,不需要过度前卫的设计,项目的生命周期是多久没人知道,最稳妥的做法是快速迭代,产品和技术工程能快速稳定的支撑业务发展即可。

经典的业务分层管理是快速迭代的基本支撑,例如常用的Mvc模式,在复杂的业务场景下可以再次细化管理,或者向领域设计靠近。

业务可以理解为流程管理,小的流程通常service中可以直接处理,但是复杂流程则十分讲究设计,一个基础思想就是分段管理,比较经典的案例就是下单:构建结算页面时初始化订单-支付时订单提交-支付成功才会执行订单。

逻辑上的细节要持续追求严谨,业务实现手段和思路适当放宽,流程经得起考验,底层实现合理的复用,组件选择上应该站在高纬度,就基本足以。


推荐内容:GitHub源码

Java进阶 | 泛型机制与反射原理

Java进阶 | IO流核心模块与基本原理

Java进阶 | Proxy动态代理机制详解

如何更好的理解java面向对象(Java进阶从整体上观察面向对象)(4)

,