Code
适配器模式(结构型)
定义:将一个类的接口转换成客户期望的另一个接口。使原本接口不兼容的类可以一起工作。
使用场景:
1、已经存在类,它的方法和需求不匹配时(方法结果相同或者相似)
2、不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案。
优点:
1、能提高类的透明性和复用性,先有的类复用但不需要改变。
2、目标类和适配器类解耦,提高程序扩展性。
3、符合开闭原则。
缺点:
1、适配器编写过程需要全面考虑,可能会增加系统的复杂度。
2、增加系统代码可读的难度。
桥接模式(结构型)
定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。通过组合的方式建立两个类之间联系,而不是继承。
适用场景:
1、抽象和具体实现之间增加更多的灵活性
2、一个类存在两个以上独立变化的维度。且这两个以上的维度需独立进行扩展
3、不希望使用集成,或因为多层集成导致系统类的个数剧增
优点:
1、分离提高抽象部分机器具体实现部分
2、提高了系统的可扩展性
3、符合开闭原则
4、符合合成服用原则
缺点:
1、增加了系统的理解与设计难度
2、需要正确识别出系统中两个独立变化的维度
开源框架:JDBC的Driver
装饰者模式(结构型)
定义:在不改变原有对象的基础上,将功能附加到对象上。提供了比继承更有唐星的替代方案(扩展原有对象功能)
适用场景:
1、扩展一个类的功能或给一个类添加附加职责
2、动态的给一个对象添加功能,这些功能可以再动态撤销
优先:
1、继承的有力补充,比继承更加灵活,不改变原有对象的情况下给一个对象扩展功能
2、通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果
3、符合开闭原则
缺点:
1、会出现更多的代码,更多的类,增加程序复杂度
2、动态装饰时,多层装饰会更负责
开源框架:JDK的I/O类
组合模式(结构型)
定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使客户端对单个对象和组合对象保持一致的方式处理。
适用场景:
1、希望客户端可以忽略组合对象与单个对象的差异时
2、处理一个树形结构
优点:
1、清除地定义分层次的复杂对象,表示对象的全部或者部分层次
2、让客户端忽略了层次的差异,方便对整个层次结构进行控制
3、讲话客户端代码
4、符合开闭原则
缺点:
1、限制类型时会比较复杂
2、使设计变得更加抽象
开源框架:JDK的awt下的Container类
外观模式(门面模式)(结构型)
定义:提供了一个统一的接口,用来访问,用来访问子系统中的一群接口。外观模式定义一个高层接口,让子系统更容易使用。
适用场景:
1、子系统越来越复杂,增加外观模式提供简单调用接口
2、构建多层系统结构,利用外观对象作为每层的入口,简化层间调用
优点:
1、简化调用过程,无需了解子系统,防止带来风险
2、减少系统以来,松散耦合
3、更好的划分访问层次
4、符合迪米特法则,即最少知道原则
缺点:
1、增加子系统、扩展子系统行为容易引入风险
2、不符合开闭原则
开源框架:SpringJDBC的JDBCUtils,对原生JDBC的代码做了封装
享元模式(结构型)
定义:提供了减少对象数量从而改善应用所需的对象结构的方式。运用共享技术有效地支持大量细粒度的对象。
适用场景:
1、常应用于系统底层的开发,以便解决系统的性能问题
2、系统有大量相似对象,需要缓冲池的场景
优点:
1、减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率
2、减少内存之外的其他资源占用
缺点:
1、关注内/外部状态,关注线程安全
2、使系统的逻辑复杂化
开源框架:JDK中的Integer的IntegerCache
代理模式(结构型)
定义:为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起中介作用。
适用场景:
1、保护目标对象
2、增强目标对象
优点:
1、代理模式能将代理对象与真实被调用的目标对象分离
2、一定程度上降低了系统耦合度,扩展性好
3、保护目标对象
4、增强目标对象
缺点:
1、代理模式会造成系统类数目增加
2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢
3、增加系统复杂度
扩展:cglib是以字节码的形式创建子类去覆盖代理类,而jdk的动态代理则是通过反射进行接口代理,在万次执行情况下,jdk的动态代理比cglib快20%。