设计模式使用场景以及优缺点(二)

本文深入解析了七大设计模式,包括适配器、桥接、装饰者、组合、外观、享元及代理模式,阐述了各自定义、适用场景、优缺点,并列举了相关开源框架实例,助力软件设计与重构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值