23种设计模式 通俗易懂 深入浅出 绝对经典.举例说明: 、DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗? 装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 ### 23种设计模式详解 #### 一、Abstract Factory(抽象工厂模式) **定义**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 **应用场景**:当系统需要创建一组相关的产品对象时,使用抽象工厂模式可以避免指定具体的类。 **优点**: - 提供了一系列表达形式相同的对象,降低了客户端的风险。 - 系统易于扩展,增加新的产品族时只需要添加具体工厂和具体产品类。 **缺点**: - 产品族扩展困难,因为需要修改现有工厂代码。 **示例**:在图形用户界面库中,不同操作系统有不同的按钮和文本框等控件,可以使用抽象工厂模式来创建这些控件。 #### 二、Adapter(适配器模式) **定义**:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 **应用场景**:当系统需要复用现有的类,但接口又与系统所需的接口不匹配时。 **优点**: - 可以让任何两个没有关联的类一起运行。 - 增加了类的复用性。 - 提高了系统的灵活性。 **缺点**: - 适配器模式让程序逻辑变得更复杂。 - 过多使用适配器会使得系统非常零乱,不易理解。 **示例**:假设你需要使用一个第三方的日志框架,但它的API与你的系统不兼容,此时可以通过适配器模式来解决接口问题。 #### 三、Bridge(桥接模式) **定义**:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 **应用场景**:当一个类存在两个独立变化的维度时,可以使用桥接模式。 **优点**: - 分离接口和实现,提高系统的可扩展性。 - 支持接口和实现的独立变化。 **缺点**: - 会导致系统中类的数量增加,复杂度提高。 **示例**:在GUI编程中,可以将抽象的窗口控制逻辑与具体的平台实现(如Windows或MacOS)分离,通过桥接模式实现跨平台的GUI应用。 #### 四、Builder(建造者模式) **定义**:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 **应用场景**:当创建一个复杂对象的算法应该独立于该对象的组成部分及其装配方式时。 **优点**: - 创建复杂对象的过程清晰明了。 - 创建相同类型的不同表示变得容易。 **缺点**: - 如果产品的内部变化复杂,则Builder模式的内部也会变得很复杂。 **示例**:在汽车制造过程中,不同的汽车配置(豪华版、标准版等)可以通过不同的建造者实现,但整个组装流程保持一致。 #### 五、Chain of Responsibility(职责链模式) **定义**:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 **应用场景**:当一个请求可以被多个对象处理时,可以使用职责链模式。 **优点**: - 减少了请求的发送者和接收者之间的耦合。 - 可以动态地增加或改变处理一个请求的对象。 **缺点**: - 职责链中的对象可能无法处理请求,导致请求被忽视。 **示例**:在一个订单处理系统中,不同的订单类型可能需要不同的部门来处理,可以使用职责链模式来决定哪个部门处理当前订单。 #### 六、Command(命令模式) **定义**:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。 **应用场景**:当一个操作需要被撤销或重做时,或者需要将请求记录到日志文件中时。 **优点**: - 降低请求发送者与接收者之间的耦合度。 - 支持可撤销的操作。 **缺点**: - 使用命令模式可能会导致某些系统有过多的具体命令类。 **示例**:在编辑器中,“撤销”功能可以通过命令模式实现,每个编辑操作都被封装为一个命令对象。 #### 七、Composite(组合模式) **定义**:将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。 **应用场景**:当需要表示具有层次结构的对象集合时。 **优点**: - 简化客户端代码,使其能够一致地处理单个对象和组合对象。 - 容易添加新的节点到树形结构中。 **缺点**: - 设计比较复杂,需要精心设计接口。 **示例**:文件系统中的目录和文件结构可以使用组合模式来表示,其中目录可以包含其他目录和文件。 #### 八、Decorator(装饰模式) **定义**:动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活。 **应用场景**:当需要给某个对象添加职责时,如果通过继承的方式会使得类的个数急剧增加。 **优点**: - 动态地添加职责。 - 替代继承机制。 **缺点**: - 装饰模式会产生很多小对象。 - 如果过度使用装饰模式,会导致设计过于复杂。 **示例**:在文章开头提到的例子中,给照片添加边框和包装盒,这就是装饰模式的应用场景之一。 以上是23种设计模式中的前八种,每一种模式都有其适用的场景和特点,掌握这些模式可以帮助开发者更好地组织代码,提高软件的可维护性和可扩展性。接下来将继续介绍剩余的设计模式。
剩余16页未读,继续阅读
- 粉丝: 16
- 资源: 27
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助