结构型模式 就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。
适配器模式(Adapter)
- 实现:在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。
2.通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
3.适用于
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
- 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作。
- 统一接口对外实现,1.不同接口包装一层,2.内部也可以是多态的多个实现。
4.例子:JDBC给出一个客户端通用的抽象接口,每一个具体数据库引擎(如SQL Server、Oracle、MySQL等)的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间的适配器软件。
装饰器模式
1.装饰器持有被包装对象的引用,构造函数传入, 并实现抽象的被包装行为。
- 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。
通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。而且具体构件类与具体装饰类可 以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类
3.适用于
- 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。
- 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类).
两者区别 都是包装模式(Wrapper),对象型的话,实现形式相同:都是has a 的持有关系。但是目的不同,adapter 是为了从一个接口转到另一个接口,不同接口;装饰器是为了在原有的基础上新增功能。
4.典型:IO流
BufferedReader in = new BufferedReader(new FileReader("filename.txt"));
String s = in.readLine();
桥接模式
1.存在多个独立变化的维度,好多分类。皮包按用途、颜色、大小多种分类。一个分支包含其他的维度的抽象行为引用。
Bag{Clolor color;Size size; Way way; public getBag(){this.color.getcolor()+this.size.getSize()+this.way.getWay();}}
2.桥接(Bridge)模式可与适配器模式联合使用
3.与工厂方法模式的区别?
外观模式/门面模式
1.外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面.
2.在很多情况下为了节约系统资源,一般将外观类设计为单例类。当然这并不意味着在整个系统里只能有一个外观类,在一个系统中可以设计多个外观类,每个外观类都负责和一些特定的子系统交互,向用户提供相应的业务功能。
享元模式
- 缓存可复用的结构,例如hashmap,可以结合工厂模式
http://c.biancheng.net/view/1366.html
https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/decorator.html