结构型设计模式
结构型设计模式解决对象与对象之间的关系问题,将不同功能的代码解耦。结构型设计模式包括代理模式、装饰模式、适配器模式、桥接模式、门面模式、组合模式、享元模式。
代理模式
定义: 在不改变原始类代码的情况下,通过引入代理类为原始类添加功能
实现: 可以使用组合或者继承实现代理模式
应用场景:
- 业务系统的非功能性需求开发, 比如:鉴权、日志、监控、限流、统计、事务、幂等
- RPC:RPC 框架也可以看作一种代理模式,RPC 服务的开 发者也只需要开发业务逻辑,就像开发本地使用的函数一样,不需要关注跟客户端的交互细 节。
- 缓存:在 AOP 切面中拦截请求,如果请求中带有支持缓存的字段,便从缓存(内存缓存或者 Redis 缓存等)中获 取数据直接返回。
动态代理
静态代理需要针对每个类都创建一个代理类,可以使用动态代理解决这个问题。动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象,动态地创建原始类对应的代理类。动态代理在项目中应用的更广泛。
装饰模式
定义: 动态的给一个对象添加一些职责。
实现: 装饰器以组合的方式实现,有两个特殊的地方,1. 装饰器类和原始类都继承相同的父类,可以对原始类嵌套多个装饰器类;2. 装饰器的意图是增强功能,这也是它和代理类的主要区别。
应用场景: 需要动态的给对象增加功能,这些功能可以再撤销,一个典型的应用就是IO类库。
适配器模式
定义: 将一个类的接口变成调用者期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
实现: 有两个实现方式,类适配器和对象适配器。类适配器使用继承来实现,对象适配器使用组合来实现。看接口适配程度以及接口数来选择。
应用场景: 兼容老版本接口、替换依赖的外部系统,让原本不兼容的接口变得兼容。
桥接模式
定义: 将抽象和实现解耦,使得两者可以独立地变化。
实现: 可以简单的理解为“抽象”和“实现”独立开发,通过对象之间的组合关系,组装在一起。“抽象”定义一套代码骨架,“实现”是一套独立的“类库”。
应用场景: JDBC、消息通知
门面模式
定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
实现: 封装多个接口,对外统一暴露一个高层次接口。
应用场景: 1. 解决易用性问题;2. 解决分布式事务问题;3. 解决性能问题
组合模式
定义: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
实现: 将一组对象组织成树形结构,将单个对象和组合对象都看做树中的节点,以统一处理逻辑,并且它利用树形结构的特点,递归地处理每个子树,依次简化代码实现。
应用场景: 1. 文件菜单,统计不同文件下文件数量;2.部门组织架构,提供接口计算出部门的薪资成本
享元模式
定义: 共享的单元,意图是复用对象,节省内存,前提是对象不可变
实现: 主要通过工厂模式,在工厂类中利用List或者Map缓存已经创建好的对象,达到复用的目的。
应用场景: 棋牌游戏中的棋子对象,文本编辑器中的文字样式等。