0 Intro
适配器模式:SD读卡器
桥接模式:抽象是抽象,具体是具体,隔离开来
过滤器模式:结果是一个list,用不同的标准类去过滤
组合模式:树
装饰器模式:实现同一套接口,但是增加功能
外观模式:隐藏结构的复杂性,比如提供一个api接口,每个api调用的模块细节隐藏
享元模式:
代理模式:实现同一套接口,但是功能不变,只是加一下控制
1 适配器模式(Adapter Pattern)
创建一个接口类,集成被扩展的类;
是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
举个真实的例子SD读卡器,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。
应用实例:
- 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
- JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
- 在 LINUX 上运行 WINDOWS 程序。
- JAVA 中的 jdbc。
2 桥接模式(Bridge Pattern)
比如绘制四种车,每种车有3种启动方式,将抽象和实现分离,解决多次继承的问题。
不必要的继承导致类爆炸;
http://www.jasongj.com/design_pattern/bridge/
在一个抽象类里面聚合其他的抽象类(比多继承好)
使用场景:
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
3 过滤器模式(Filter、Criteria Pattern)
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
即声明一种检测标准类,如下:
import java.util.List;
public interface Criteria {
public List<Person> meetCriteria(List<Person> persons);
}
通过实现这个接口来选出不同的对象。
4 组合模式(Composite Pattern)
其实就是树的架构,每个节点都相同
应用实例:
- 算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。
- 在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。
使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
5装饰器模式(Decorator Pattern)
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
类图:https://www.jianshu.com/p/d80b6b4b76fc
以下情况可以使用装饰器模式:
- 在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责
- 处理那些可以撤销的职责
- 当使用子类扩展的方式不切实际的时候,可考虑使用装饰器模式
应用实例: - 图书馆图书类 https://zhuanlan.zhihu.com/p/25003369
- 齐天大圣类 https://www.jianshu.com/p/d80b6b4b76fc
6 外观模式(Facade Pattern)
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/facade.html
应用实例:
- 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
- JAVA 的三层开发模式。
7 享元模式(Flyweight Pattern)
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
跟单例模式差不多,可以称之为多例模式:
核心使用一个hashmap存储一个之前用过的对象,如果有了就不用创建新的了
何时使用:
- 系统中有大量对象。
- 这些对象消耗大量内存。
- 这些对象的状态大部分可以外部化。
- 这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
- 系统不依赖于这些对象身份,这些对象是不可分辨的。
应用实例:
- JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。
- 数据库的数据池。
8 代理模式(Proxy Pattern)
一个类代表另一个类的功能。
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
例子:
注意事项:
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
- 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
网友评论