贫血模型&&充血模型
什么是贫血模型
贫血模型也是一种软件设计模式,在面向对象的设计中,它最显著的特点便是实体类(领域模型)仅包含属性字段,和最基本的get/set方法,而没有包含任何与业务逻辑相关的行为在贫血模型中,业务逻辑往往被移到了服务层或者其他地方,而不是和领域对象紧密结合。这种设计虽然让领域对象变得简单,但违背了面向对象设计中的“将数据和行为封装在一起”的原则, 大部分业务逻辑都放在服务层或应用层进行处理,导致领域模型只起到数据载体的作用。比如传统MVC开发结构:
什么是充血模型
与贫血模型相对,其数据与行为集中、具有高内聚性、封装性强的特点,它将一个对象的属性信息与基本行为逻辑聚合到一个类中,往往包含一个对象的公共方法,比如一些基本的信息校验、一些key的拼接、字符串切割,金融领域对象的一些计算例如,罚息等。除此之外,充血模型不仅仅是说一个对象,将一个Service服务相关所需要的各个零部件(模型、仓储、工厂)放在一个包结构下也可以看作是充血模型使其在使用一个对象的同时,还能获取到这个对象所提供的一系列方法信息,避免了在后面的开发过程中再次处理同类逻辑。
eg:
Docker安装Elasticsearch遇到的问题
解决方式:
添加一个环境变量参数"_JAVA_OPTIONS=-XX:UseSVE=0"
完整命令:
1234567891011121314docker run -d \ --name elasticsearch \ --restart=always \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -e "_JAVA_OPTIONS=-XX:UseSVE=0" \ -v /Users/zuochenyang/codeEnv/docker/service/elasticsearch/data:/usr/share/elasticsearch/data \ -v /Users/zuochenyang/codeEnv/docker/service/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -v /Users/zuochenya ...
SpringBoot整合OCR功能
简介
使用Java实现图片内容的实现功能,如验证码图片的读取
所用框架:Tess4j 项目地址:https://github.com/nguyenq/tess4j
整合使用
安装下载tessdata语言包,添加语言库
tessdata.zip
引入依赖:
12345678910<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.14.0</version></dependency><dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>4.5.4</version></dependency>
整合基本使用
定 ...
Lambda表达式的方法引用
概述在使用Lambda表达式的时候,我们在方法体中所写的代码就相当于是一种解决方案:那所提供的参数,执行方法体中的代码。所以如果当时Lambda表达式的方法体中除了调用现有方法之外什么都不做,就使用其本来就已经存在的方案,这个时候我们就可以采用方法引用的书写方式。
实例方法引用语法:对象 :: 实例方法
特点:在Lambda表达式的方法体中,通过“对象”来调用指定的某个“实例方法”。
什么是实例方法?
在Java中,实例方法是与对象实例相关联的方法。换句话说,它们是定义在类中的方法,必须通过类的实例(对象)来调用。实例方法可以访问和操作对象的属性,并且可以调用其他实例方法。
要求:函数式接口中抽象方法的返回值类型和形参列表与内部通过对象调用某个实例方法的返回值类型和形参列表保持一致。
12Consumer<String> consumer = System.out::println;consumer.accept("Hello World");
1234567891011Teacher teacher = new Teacher("ande ...
useRoute与useRouter的区别
官方文档:https://router.vuejs.org/zh/api/#Functions-useRoute
useRoute():返回当前的路由地址。相当于在模板中使用 $route。
useRouter():返回路由器实例。相当于在模板中使用 $router。
useRoute( )函数useRoute( )函数用于在组件中获取当前路由的信息,返回一个包含路由信息的对象。每一个路由都有一个route对象,这是一个局部的对象,可以从中获得name、path、params、query(如下所示)等当前路由信息的静态数据。
使用案例:
1234567891011121314151617181920212223<template> <div id="app"> <template v-if="route.path.startsWith('/user')"> <NoHeaderLayouts /> </template> <template v-els ...
四个基本的函数式接口
函数式接口介绍:函数式接口是Java 接口的一种,但在接口的基础上,还需要满足:
一个函数式接口只有一个抽象方法(SAM,single abstract method);
Object 类中的 public abstract method 不会被视为单一的抽象方法;
函数式接口可以有默认方法和静态方法;
函数式接口可以用@FunctionalInterface 注解进行修饰。
函数式接口的作用:函数式接口带给我们最大的好处就是:可以使用极简的Lambda表达式实例化接口。
四个基本的函数式接口:
以上的函数式接口都在java.util.function包中,通常函数接口出现的地方都可以使用Lambda表达式
@FunctionalInterface :
一个接口只要满足只有一个抽象方法的条件,即可以当成函数式接口使用,有无@FunctionalInterface都无所谓,但是jdk定义了这个注解肯定是有原因的。
@FunctionalInterface更相当于是一种限制,凡是使用了这个注解的接口,开发者可放心大胆的使用lambda来实例化,使用了这个注解的接口只允许存在一个抽象方 ...
为什么不推荐使用Join
在阿里的Java开发规范手册中,写明“超过三个表禁止使用Join”
难以进行维护,影响代码阅读。复杂的Join查询难以阅读和维护,尤其是在多表连接中需要处理多个连接条件和筛选条件。容易出现逻辑错误,难以排查问题。
索引的设计将变得复杂。为了提高多表Join查询的性能,需要为每个表创建合适的索引,这样也就增加了索引的设计与维护的复杂性。
最主要要的原因在于其Join本身的效率就比较低。MySQL采用循环嵌套的方式来实现关联查询(用第一张表做外循环,第二张表做内循环,外循环的每一套记录跟内循环中的记录作比较,符合条件的则输出)。如果有两张表的join,复杂度最高为O(n^2)。三张表则是O(n^3)。所以当join的表越多,join的效率会呈指数级下降。
Lambda表达式的基本使用
语法进一步精简规则在原本的语法基础上,Lambda表达式已经相对来说比较精简了,但在以下的应用场景中,我们就可以对Lambda表达式的语法进行精简,场景如下:
形参类型可以省略,如果需要省略,则每个形参的类型都要省略。
如果形参列表中只存在一个形参,那么形参类型和小括号都可以省略。
如果方法体当中只有一行语句,那么方法体的大括号也可以省略。
如果方法体中只有一条return语句,那么大括号可以省略,且必须去掉return关键字。
基本使用结合更为精简的语法规则对Lambda表达式进行运用
无返回值函数式接口情况一:无返回值无参数123456789NoParameterNoReturn obj1 = new NoParameterNoReturn() { @Override public void test() { System.out.println("无参无返回值"); }};obj1.test();NoParameterNoReturn obj2 = () -> System.ou ...
Lambda表达式介绍
函数式编程思想Java从诞生之日起就一直倡导“一切皆对象”,在Java语言中面向对象(OOP)编程就是一切,但是随着Python和Scala等语言的崛起和新技术的挑战,Java也不得不做出调整以便支持更加广泛的技术要求,即Java语言不但支持OOP还支持OOF(面向函数编程)。
JDK1.8引入Lambda表达式之后,Java语言也开始支持函数式编程,但是Lambda表达式不是Java语言最早使用的,目前C++、C#、Python、Scala等语言都支持Lambda表示。
Lambda表达式是JDK1.8的一个新特性,可以取代大部分的匿名内部类,以便写出更优雅的Java代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
面向对象的思想
做一件事情,找一个能解决这个事情的对象,然后调用对象的方法,最终完成事情。
函数式编程思想
只要能获得结果,谁去做的,怎么做的都不重要,重视的是结果,不重视实现过程。
JDK1.8中的Lambda表达式就是一个函数式接口的实例,这就是Lambda表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口的实例,那么 ...
vue3实现省市联动表项
概述所用技术栈:vue3+ElementPlus
需求:要求在对用户信息中的籍贯信息录入时,有一个省市联动的表单可供选择
具体实现参考文档:https://www.npmjs.com/package/element-china-area-data
下载对应插件:
1npm install element-china-area-data -S
导入库:
1234567import { provinceAndCityData, pcTextArr, regionData, pcaTextArr, codeToText,} from "element-china-area-data";
vue3页面代码的实现:
1234567<el-cascader size="large" :options="pcTextArr" v-model="sd" @change="handleChange" ></el-cascader>
12 ...






