适配器模式
含义:
在设计模式中,适配器模式(英语:adapter pattern)有时候也称变压器模式、包装样式。将一个类的接口转接成用户所期待的另一种接口。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作。
何时使用:
对于已经使用的接口,需要进行修改/扩展时。改造前后项目一定要遵循依赖导致原则和里氏替换原则。
1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
具体实现方式
1.类的适配器模式
将被适配的类的api转换为目标类的api
target :目标角色,必须为接口
adaptee :源角色 需要适配的
adapter : 适配器角色 必须为具体类
2.对象的适配器结构(委托方式)
优缺点
类适配器的优点:
1、由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
类适配器的缺点:
1、对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。
对象适配器的优点:
1、把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。
对象适配器的缺点:
1、与类适配器模式相比,要想置换适配者类的方法就不容易。
合成模式
含义:
将对象组合成树形结构以表述"部分-整体"的层次结构,是的用户对单个对象和组合对象的使用具有一致性
component:抽象构件角色
leaf 叶子构件
composite 树枝构件
安全组合模式是对依赖倒转原则的破坏。
优缺点:
优点:
1.高层模块调用简单(所有节点都是component)
2.节点自由增加(增加一个节点只需要找到他的父节点就可以了,非常容易扩展,符合开闭原则)
缺点:
树叶和树枝定义时直接使用了实现类,与依赖倒置原则冲突。
使用场景:(树形结构时)
1.维护和展示整体-部分关系的场景,比如属性菜单,文件,文件夹管理
2.从一个整体中能够独立出部分模块或功能的场景
拓展:
透明组合模式:
遍历更加方便。
最佳实践:
1.xml的结构
2.js树形的菜单。
3.存储组织结构
装饰者模式
含义:
动态的给一个对象添加一些额外的职责(通过改写对象的一些方法),就添加功能而言,装饰模式比生成子类更加灵活。
类图说明:
1.*抽象构件(Component):给出一个抽象类/接口,以规范准备接收附加责任的对象。2.具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。3.装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。4.具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
如果只有一个装饰类的华,3 4 可以合成一个。
优缺点
优点:
1.装饰类与被装饰类解耦,不需要关系具体的被装饰类是什么(这也是为什么不使用子类继承重写方法的原因)
2.装饰模式是继承关系的一个替代方案。Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
缺点:
1.这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
使用场景:
1.需要扩展一个类的功能,或者增加附加功能。
2.需要动态给一个对象增加功能,这些功能可以在动态的撤销
3.需要一批的兄弟类进行改装或加装功能时。
举例:
数据库连接池日志打印。