一、面向对象

面向对象是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. .NET网页后台调用前台js方法时相同Key,调用不成功

    ClientScript.RegisterStartupScript(GetType(), "key", "<script>Save()</script ...

  2. 一个SDK给我干懵逼了?大厂的SDK就这?

    活久见 .org.jboss.netty 和 io.netty 你分的清吗? 大家好,我是小猿来也,一个热衷写 bug 的程序猿. 一天我正在专心致志写 Bug 的时候,一个同事跑过来找我. 说有个很 ...

  3. Elasticsearch的配置学习笔记

    文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器.它提供一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java语言开发的. ...

  4. centos安装配置和使用 Nexus

    Nexus安装配置和使用 第一步安装jdk yum install java-1.8.0-openjdk-devel 第二步下载nexus-3.12.1-01-unix.tar.gzjdk 下载地址: ...

  5. 所有的Java虚拟机必须实现在每个类或接口被Java程序 “ 首次主动使用 ” 时才初始化他们

    原文:https://www.cnblogs.com/fanjie/p/6916784.html Java程序对类的使用方式可分为两种– 主动使用– 被动使用 被动使用以后再讲,这里说说什么是主动使用 ...

  6. 你会用哪些JavaScript循环遍历

    总结JavaScript中的循环遍历定义一个数组和对象 const arr = ['a', 'b', 'c', 'd', 'e', 'f']; const obj = { a: 1, b: 2, c: ...

  7. Apache Superset 1.2.0教程 (二)——快速入门(可视化王者英雄数据)

    上一篇我们已经成功的安装了superset,那么该如何可视化我们的数据呢?本文将可视化王者英雄的数据,快速的入门Superset. 一.连接数据源 首先确保mysql可以正常连接使用,并且准备好数据. ...

  8. SESSION和JWT

    1.传统登录的方式是使用 session + token,比较适用于Web应用的会话管理.token 是指在客户端使用 token 作为用户状态凭证,浏览器一般存储在 localStorage 或者 ...

  9. 由ctf来看java报错的危害

    很多java报错在我们渗透的时候经常会被发现,但由于没什么用,危害比较低被忽略,开发也很不愿意修改. 但从纵深防御的角度来说,多个小问题的结合就会产生严重的问题.此次遇到的一个ctf题就是一个例子. ...

  10. nginx+waf防火墙

    1.官网下载nginx源码包(nginx-1.20.0.tar.gz) 新建nginx安装目录​mkdir -p /opt/nginx​新增nginx运行用户​useradd -s /sbin/nol ...