享元模式原理与实现 定义 所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是 享元对象是不可变对象。 具体来讲,当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。实际上,不仅仅相同对象可以设计成享元,对于相似对象...
门面模式
平衡接口粒度 接口粒度更细(职责单一) 接口具有更好的可复用性 接口的使用者开发一个业务功能时,需要调用 n 多细粒度的接口才能完成,调用者会抱怨接口不好用。 接口粒度设计得太大 一个接口能做更多的事 可复用性不好。那针对不同的业务需求,就需要开发不同的接口来满足,这就会导致系统的接口无限膨胀。 那如何来解决接口的可复用性(通用性)和易用性之间的矛盾呢?门...
迁移Postgres的Sequence(序列)
如何在迁移数据库时导出 SEQUENCE navicat 转储数据和结构 sql 时无法生成自增序列的 sql,但 pgAdmin4 做到了,下面是 pgAdmin 导入和导出 sql 的操作演示: 下面是导入操作: 如何创建 SEQUENCE 创建序列:CREATE SEQUENCE my_sequence INCREMENT 1 START 1 ...
组合模式
组合模式的原理和实现 定义 组合模式跟之前讲的面向对象设计中的“组合关系(通过组合来组装两个类)”,完全是两码事。这里讲的“组合模式”,主要是用来处理树形结构数据。这里的“数据”,可以简单理解为一组对象集合,它的定义如下: 将一组对象组织(Compose)成树形结构,以表示一种“部分-整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合...
导入导出注解式解决方案
需求从何而来 减少导入导出 dto/vo 的新建,希望配合注解和 entity 解决(注解的 type 标识是否 import or import 这样能减少 dto/vo 类的数量),其中注解可用于标注语义转换(如 1 - > 男,0 -> 女) 相关值得校验耦合在了业务代码中,可以在 Service 定义自己的 importValid 方法,并用 StringBui...
适配器模式
适配器模式的原理和实现 适配器模式(Adapter Design Pattern),顾名思义:一种接口通过适配器模式能够当成另一种接口进行使用,它的意义是能够通过多态的方法,使得新增的接口能在不改变上层调用的实现就可以迅速接洽到程序中。 适配器模式的两种实现方式 类适配器使用继承关系来实现,对象适配器使用组合关系来实现 实现方式如下:其中,ITarget 表示要转化成的接口定义。Adap...
备忘录模式
定义 来自 GOF 的定义:Captures and externalizes an object’s internal state so that it can be restored later, all without violating encapsulation. 翻译过来就是:在不违反封装原则的前提下,捕获并外部化一个对象的内部状态,以便将来可以恢复到这个状态。 从定义来看还...
装饰器模式
装饰器模式在 Java IO 中的应用 Java IO 类可分为下面四个维度: 而根据不同的读取和使用场景 Java IO 又在这四个父类基础之上,扩展出了很多子类: 但我们重点关注上图中最右边的一个类 BufferedInputStream,首先看下它的用法: InputStream in = new FileInputStream("/user/wangzheng/test...
桥接模式
JDBC 与 MySQL、Oracle 等驱动实现的联系 如何做到在不修改代码或者很少修改代码的情况下切换数据库 JDBC 是作为规范抽离出来的框架,而 MySQL、Oracle 驱动是在遵循规范的基础上根据自身数据库做的一套实现。 而 JDBC 和 MySQL、Oracle 驱动之间通过组合实现了如此优雅的数据库切换方式,而这便是桥接模式的一种经典使用场景。 定义 将抽象和实现解耦,...
如何调用本业务模块外的服务——服务调用
服务调用方式 既然引入了注册中心来统一的管理服务的每个实例,那么我们就可以大方的去调用其他的服务了。 服务间调用常见的两种方式:RPC 与 HTTP: RPC 全称 Remote Produce Call 远程过程调用,速度快,效率高,早期的 WebService 接口,现在热门的 Dubbo、gRPC 、Thrift、Motan 等,都是 RPC 的典型代表 HTTP 协议(...