一、面向对象

面向对象是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{}

2、依赖与关联

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

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

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 ;
}

三、模式与原则

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

1、设计模式

创建模式

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

  • 单例模式
  • 原型模式
  • 工厂模式
  • 建造者模式

结构模式

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

  • 代理模式
  • 外观模式
  • 适配器模式
  • 装饰者模式
  • 组合模式
  • 享元模式
  • 桥梁模式

行为模式

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

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

  • 观察者模式
  • 模版方法模式
  • 策略模式
  • 命令模式
  • 调停者模式
  • 备忘录模式
  • 解释器模式
  • 迭代器模式
  • 状态模式
  • 责任链模式
  • 访问者模式

2、基本原则

  • 开闭原则:在做代码结构设计时,应该考虑对扩展开放,对修改关闭,抽象思维搭建结构,具体实现扩展细节。

  • 单一职责:一个类应该只负责一项职责;减少代码一处变更引起的程序大规模改动情况,降低类的复杂度;

  • 接口隔离:每一个接口应该是一种角色;尽量避免具体实现类中用不到但是又必须实现的方法;

  • 依赖倒转:上层模块不应该依赖下层模块,抽象逻辑不应该依赖具体细节,即中心思想是面向接口编程。

  • 里氏替换:继承时遵循里氏替换原则,子类中尽量不要重写父类的方法,可以扩展父类的功能;

  • 迪米特原则:最少知道原则即类对象对其依赖的类知道的越少越好,以此降低耦合程度;

  • 组合/聚合复用:新对象应使用部分已有的对象,使其成为新对象组成部分,实现已有功能的复用,以此降低单个类的复杂程度。

四、业务应用

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

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

  • 规范约束

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

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

  • 可复用性

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

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

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

  • 业务分层

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

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

  • 流程分段

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

  • 细节问题

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

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

阅读标签

Java基础】【设计模式】【结构与算法】【Linux系统】【数据库

分布式架构】【微服务】【大数据组件】【SpringBoot进阶】【Spring&Boot基础

数据分析】【技术导图】【 职场

Java进阶 | 从整体上观察面向对象的更多相关文章

  1. Java进阶5 面向对象的陷阱

    Java进阶5 面向对象的陷阱 20131103 Java是一门纯粹面向对象的编程语言,Java面向对象是基础,而且面向对象的基本语法非常多,非常的细,需要程序员经过长时间的学习才可以掌握.本章重点介 ...

  2. Java进阶学习:将文件上传到七牛云中

    Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...

  3. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

  4. Java进阶路线图

    第一阶段 技术名称 技术内容 J2SE(Java基础部分) Java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程序的执行过程,相关反编译 ...

  5. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

  6. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  7. 当我们说线程安全时,到底在说什么——Java进阶系列(二)

    原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...

  8. 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)

    本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...

  9. Java进阶(三十七)java 自动装箱与拆箱

    Java进阶(三十七)java 自动装箱与拆箱 前言 这个是jdk1.5以后才引入的新的内容.java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装称为装箱,解包装称为 ...

随机推荐

  1. Unity不规则按钮点击区域(UGUI)

    文章目录 一. 前言 二. 最终效果 三. 实现 1.创建UICamera 2. UIPolygon节点 3. 编辑碰撞区域 5. 运行测试 6. UIPolygon代码 一. 前言 游戏开发中,可能 ...

  2. Spring Cloud 整合 Feign 的原理

    前言 在 上篇 介绍了 Feign 的核心实现原理,在文末也提到了会再介绍其和 Spring Cloud 的整合原理,Spring 具有很强的扩展性,会把一些常用的解决方案通过 starter 的方式 ...

  3. 关于Word转Markdown的工具Writage安装及使用

    简介 Writage是为希望开始编写结构良好的文档,没有时间或不想深入了解 Markdown 语法的详细信息,或者更愿意使用 Word 作为文本编辑器的每个人设计的 下载并安装 安装包地址:https ...

  4. 关于vim

    全部删除:按esc后,然后dG全部复制:按esc后,然后ggyG全选高亮显示:按esc后,然后ggvG或者ggVG 在win中使用<C-a>是全选,如果需要在vim中使用<C-a&g ...

  5. Pandas高级教程之:统计方法

    目录 简介 变动百分百 Covariance协方差 Correlation相关系数 rank等级 简介 数据分析中经常会用到很多统计类的方法,本文将会介绍Pandas中使用到的统计方法. 变动百分百 ...

  6. ROS踩坑笔记总结

    2019-07-12 11:32:16 我的第一篇原创博客(当然是站在巨人肩膀上,有些内容参考了其他大神的博客,都一一做了说明),这些是我之前在学习ROS期间经历的一些坑,以及相对应的解决方案,希望可 ...

  7. Windows环境mysql自动备份

    1.编写bat文件备份mysql 1 rem ******MySQL backup start****** 2 @echo off 3 4 ::删除一周前的备份数据 5 forfiles /p &qu ...

  8. 2021最新WordPress安装教程(三):安装WordPress详细步骤

    前面已经通过< 2021最新WordPress安装教程(一):Centos7安装Apache>和< 2021最新WordPress安装教程(二):配置PHP和MySQL>两篇文 ...

  9. ARC 122 简要题解

    ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...

  10. c语言:输出汉字编码

    #include<stdio.h> main() { //char a[5]; //strcpy(a,"啊"); char a[5]="职"; pr ...