GOF23种设计模式之结构型设计模式
何为设计模式
大家熟知的GOF23种设计模式,源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著,四人组Gang of Four简称GOF!总结了在面向对象语言开发过程中常见问题的解决方案。
设计模式是面向对象语言开发过程中,应对各种场景和问题提出的思路和解决方案。
三大类设计模式
- 结构型设计模式,关注类与类之间的关系
- 创建型设计模式,关注对象的创建
- 行为型设计模式,关注对象和行为的分离
下面我们来说下第一种:结构型设计模式
结构设计我们一般来说分为七种:
1.Adapter Class/Object(适配器)
2.Bridge(桥接)
3.Composite(组合
4.Decorator(装饰)
5.Facade(外观)
6.Flyweight(享元)
7.Proxy(代理)
这七种结构型设计模式关注类与类之间的关系,其本质就是通过组合与继承,为程序提供更好的灵活性和拓展性。
类与类之间的关系
我们在面向对象编程中是离不开类与类之间交互的,其中类与类的关系分为横向与纵向
- 横向:是一种平层关系,主要表现在组合-聚合-关联-依赖
- 依赖关系(Dependence):假设A类的变化引起了B类的变化, 则说名B类依赖于A类。—方法里面/参数,是一种很淡的关联
- 关联关系(Association):两个类之间语义级别的一种强依赖关系。----Kobe与Lakers
- 聚合关系(Aggregation):表示的是整体和部分的关系,整体与部分是可以分开。—车和发动机
- 组合关系 :组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。—人与心脏
- 纵向:是一种层级关系,主要表现在继承与实现
从依赖关系上说:
纵向 继承==实现>组合>聚合>关联>依赖
一般认为组合优于继承,横向优于纵向
适配器模式(AdapterPattern)
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
分两种:
类型适配器
对象适配器
适配器属于一种补救模式,一般在引用全新组件用上,下面列举一个常见场景:
当关系型数据库不能满足诉求,启用Redis
代理模式(Proxy)
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。可以理解成我们生活中的中介。
其结构也非常简单
一般来说,只要是非业务性诉求,代理模式基本都能搞定。
装饰器(Decorator )模式
向一个现有的对象添加新的功能,同时又不改变其结构。也就是在程序运行时能动态的扩展功能。
其实就是一个组合+继承的融合应用,也是大家在开发中最常用的到,我们可以任意拓展功能,甚至顺序也可以随意调整。
总结
以上三种结构型设计模式就是我们在实际场景下使用最频繁
- 适配器模式解决对象适配问题,是新增业务,不是去扩展公共逻辑
- 代理模式 解决对象调用的问题,可以扩展公共逻辑,坚决不增业务
- 装饰器模式解决需要增加功能,但是对象不变的情况