结构型模式
简介
本文章旨在记录学习设计模式的过程,学习内容主要来自菜鸟教程,网址:设计模式,学习代码整理在:代码仓
八种结构型模式
适配器模式(Adapter Pattern)
- 使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式
- 主要思想:适配器继承或依赖已有的接口,实现想要的目标接口
- 代码示例:在代码仓中包名
design.pattern.adapter
下 - 个人理解:它与原来的类继承自同一接口,它构造时的传参可以跟原来的类不同,但它的使用方式与原来的类相同
桥接模式(Bridge Pattern)
这里这个教程我没看太懂,看到了另一篇教程,看的比较懂了。
- 使用场景:一个类有两个(我理解多个也是)变化的维度,且两个维度都需要扩展(举例:上面所说的类举例为形状,我需要正方形、圆形、三角形等,而每个形状又需要红色、绿色、黄色各一种;这样,一共就需要九种形状的结果)
- 主要思想:对于不同的维度,分别以继承的方式实现,并在使用时结合起来(比如上面的例子,我只需要分别实现三个形状:正方形、圆形、三角形,再分别实现三个颜色:红色、绿色、黄色,这样结合起来之后就能得到我想要的九种具体图形;并且后续想要扩展的时候,也只需要扩展一个实现类,就可以新得到三种具体的图形)
- 代码示例:在代码仓中包名
design.pattern.bridge
下
过滤器模式(Filter、Criteria Pattern)
- 使用场景:需要使用不同的标准对一组对象进行过滤时
- 主要思想:定义一个过滤接口,实现多个过滤器,并可以通过逻辑运算的方式将多个过滤器结合起来对这组对象进行过滤
- 代码示例:在代码仓中包名
design.pattern.criteria
下 - 个人理解:像是工厂加工之后,根据不同的产品标准,一一筛掉不符合标准的产品,最后得到的是通过了每道标准的产品
组合模式(Composite Pattern)
- 使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理
- 主要思想:表示元素的内部存放一个本元素的列表,用以表示本元素的子元素
- 代码示例:在代码仓中包名
design.pattern.composite
下
装饰器模式(Decorator Pattern)
- 使用场景:扩展一个类的功能,动态增加功能、动态撤销功能
- 主要思想:扩展类与原类继承自同一个接口,在扩展类中调用原类的函数实现,并新增装饰的功能
- 代码示例:在代码仓中包名
design.pattern.decorator
下 - 个人理解:精髓就在于装饰类与被装饰类继承自同一接口,在调用时,将装饰类的对象当做被装饰类的对象调用,但实际上装饰类的对象中已经新增了扩展功能,而它构造时的参数是一个已经存在的对象
外观模式(Facade Pattern)
- 使用场景:为复杂的模块或子系统提供外界访问的模块
- 主要思想:在客户端与复杂系统之间提供一层接口
- 代码示例:在代码仓中包名
design.pattern.facade
下 - 个人理解:思想比较简单,想要一个复杂系统中的某个功能,写一个接口,专门提供这个功能就可以了
享元模式(Flyweight Pattern)
- 使用场景:系统中有大量相似的对象,需要缓冲池
- 主要思想:在内存中保存相同的对象,如果有相同的业务需求,则直接返回内存中的对象
- 代码示例:在代码仓中包名
design.pattern.flyweight
下
代理模式(Proxy Pattern)
- 使用场景:为其他对象提供一种代理来控制对这个对象的访问
- 主要思想:在访问一个类时做一些控制,增加中间层,其实现与被代理类组合
- 代码示例:在代码仓中包名
design.pattern.proxy
下 - 注意事项:
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口
- 和装饰器模式的区别:装饰器模式是为了增强功能,而代理模式是为了加以控制