Design Patterns

设计模式之装饰模式

元气小坏坏 提交于 2020-08-19 01:06:50
装饰模式 Decorator Intro 装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活 使用场景 装饰模式是为已有功能动态地添加更多功能的一种方式 当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,但是往往会在主类中加入新的字段/方法/逻辑,从而增加了主类的复杂度, 而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要 装饰模式提供了一个很好的方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象, 当需要执行特殊行为时,就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。 装饰模式的优点时把类中的装饰功能从类中搬移去除,这样可以简化原有的类,这样做就有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。 Prototype Component 定义一个对象的抽象,可以给这些对象动态的添加职责 ConcreteComponent 定义一个具体的对象,也可以给这个对象添加一些职责 Decorator 装饰抽象类,继承了 Component,从外类来扩展 Component 类的功能,但对于 Component 来说是无需知道 Decorator 的存在的 ConcreteDecorator 具体的装饰对象,起到给

设计模式(5) 原型模式

无人久伴 提交于 2020-08-18 09:06:42
原型模式 原型模式的适用场景 浅拷贝 深拷贝 用Initialize方法修改初始化状态 原型模式与之前学习的各种工厂方法、单例模式、建造者模式最大、最直观的区别在于,它是从一个既有的对象“克隆”出新的对象,而不是从无到有创建一个全新的对象。与对文件的拷贝类似,原型模式是基于现有的对象拷贝新的对象。 原型模式 GOF对原型模式的描述为: Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.. — Design Patterns : Elements of Reusable Object-Oriented Software 原型模式的构造对象的的过程是,选择一个现成对象(原型对象),通过调用它的“克隆”方法来获得一个和它一样的对象。 其UML类图为: 原型模式的适用场景 原型模式适用与如下场景: Factory、Builder、Singleton返回的都是“初始状态”的对象,但有的时候需要的对象反而是处于某种状态的对象; 如果一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算,则可以使用原型模式直接克隆; 当需要一个对象的大量公共信息,少量字段进行个性化设置的时候

设计模式之装饰模式

寵の児 提交于 2020-08-15 19:03:52
装饰模式 Decorator Intro 装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活 使用场景 装饰模式是为已有功能动态地添加更多功能的一种方式 当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,但是往往会在主类中加入新的字段/方法/逻辑,从而增加了主类的复杂度, 而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要 装饰模式提供了一个很好的方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象, 当需要执行特殊行为时,就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。 装饰模式的优点时把类中的装饰功能从类中搬移去除,这样可以简化原有的类,这样做就有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。 Prototype Component 定义一个对象的抽象,可以给这些对象动态的添加职责 ConcreteComponent 定义一个具体的对象,也可以给这个对象添加一些职责 Decorator 装饰抽象类,继承了 Component,从外类来扩展 Component 类的功能,但对于 Component 来说是无需知道 Decorator 的存在的 ConcreteDecorator 具体的装饰对象,起到给

组合Composite

痞子三分冷 提交于 2020-08-15 04:03:46
树状模式专用模式 树状结构:目录和子文件组成的 介绍 意图: 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 主要解决: 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 如何解决: 树枝和叶子实现统一接口,树枝内部组合该接口。 关键代码: 树枝内部组合该接口,并且含有内部属性 List,里面放 Component。 应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。 优点: 1、高层模块调用简单。 2、节点自由增加。 缺点: 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。 使用场景: 部分、整体场景,如树形菜单,文件、文件夹的管理。 代码结构 1. 创建一个节点抽象类 Node 2. 创建一个叶子类继承抽象类 Node 3. 创建一个枝叶

关于c++设计模式的总结

流过昼夜 提交于 2020-08-15 02:47:13
抽象工厂,决定产品系列的产品的组合,特点是创建同一款式的产品系列。缺点是增加产品组件,需要修改抽象工厂接口,影响抽象工厂子类。 builder,决定产品的各个部分的build的过程。替换相应的builder子类,就可以修改产品相应的各个part部件的实现;替换相应的Director子类,就可以修改builder组件的调用顺序(即控制创建过程)。 工厂方法,产品子类和creator子类一 一对应。不直接调用FactoryMethod操作,定义了何时调用FactoryMethod。扩展相关子类可以修改此调用时间 Prototype,产品自身就是自己的creator Singleton,产生全局的单一实例 1)以上是创建型:创建型设计模式核心是通过替换直接调用new创建具体对象这种方式,从而去client代码和产品对象之间的耦合。client都是通过接口引用工厂,通过接口引用产品,所以替换更方便。 adapter,描述了client如何做到通过target接口,来使用Adaptee的操作函数。 bridge,“抽象接口定义”和“具体实现部分”分离。分离后,可以各自发展。 composite,从共同接口派生,使对单个对象和组合对象的使用具有一致性,并且支持递归组合。 Decorator,共同的父类,接口相同,可以透明的、递归的增加额外的职责。与composite区别是只有一个组件

设计模式概述

怎甘沉沦 提交于 2020-08-14 01:28:13
一、定义   设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是 为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 二、产生背景   肯特·贝克和沃德·坎宁安在1987年利用克里斯托佛·亚历山大在建筑设计领域里的思想开发了设计模式并把此思想应用在Smalltalk中的图形用户接口的生成中。一年后Erich Gamma在他的苏黎世大学博士毕业论文中开始尝试把这种思想改写为适用于软件开发。与此同时James Coplien 在1989年至1991 年也在利用相同的思想致力于C++的开发,而后于1991年发表了他的著作Advanced C++ Idioms。就在这一年Erich Gamma 得到了博士学位,然后去了美国,在那与Richard Helm, Ralph Johnson ,John Vlissides合作出版了Design Patterns - Elements of Reusable Object-Oriented Software 一书,在此书中共收录了23个设计模式。这四位作者在软件开发领域里也以他们的匿名著称Gang of Four(四人帮,简称GoF),并且是他们在此书中的协作导致了软件设计模式的突破。有时这个匿名GoF也会用于指代前面提到的那本书。 三、学习的意义   设计模式的本质是面向

设计模式(17) 迭代器模式

穿精又带淫゛_ 提交于 2020-08-11 21:36:20
迭代器模式 基于IEnumerable的实现 使用场景 迭代器模式的优缺点 迭代器模式 迭代器模式用于顺序访问集合对象的元素,而不需要知道集合对象的底层表示。Java和.Net等语言已经将迭代器作为其内部语法元素,比如在C#中,集合对象只需要实现IEnumberable接口,然后就可以用foreach来遍历了。 迭代器模式提示我们要从使用者的角度考虑如何设计接口,如何对外提供访问内部对象的方式。即便我们组织的对象系统内部结构很复杂,但对于客户程序而言最简单的方式莫过于通过for /foreach循环依次遍历,至于遍历过程中的次序、分类筛选等则由目标类型自己封装。 GOF对迭代器模式描述为: Provide a way to access the elements of an aggregate objectsequentially without exposing its underlying representation. — Design Patterns : Elements of Reusable Object-Oriented Software UML类图: 代码实现 //迭代器接口 public interface IIterator<T> { T Next(); bool HasNext(); } //具体迭代器 public class

Java核心库中的GoF设计模式示例

自闭症网瘾萝莉.ら 提交于 2020-08-11 20:47:19
问题: I am learning GoF Java Design Patterns and I want to see some real life examples of them. 我正在学习GoF Java设计模式,我想看看其中的一些现实示例。 What are some good examples of these Design Patterns in Java's core libraries? Java核心库中的这些设计模式有哪些好的示例? 解决方案: 参考一: https://stackoom.com/question/71RR/Java核心库中的GoF设计模式示例 参考二: https://oldbug.net/q/71RR/Examples-of-GoF-Design-Patterns-in-Java-s-core-libraries 来源: oschina 链接: https://my.oschina.net/u/4438370/blog/4341265

设计模式(4) 建造者模式

北慕城南 提交于 2020-08-11 12:57:22
什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。 虽然与工厂模式、抽象工厂模式、单件模式同为创建型模式,但建造者模式与之前学习的模式相比,更为关注创建过程的细节,它一般用于创建复杂对象,从独立创建每个部分到最后的组装,它承担每个步骤的工作。由于它把创建每个部分都独立为一个单一的过程,因此不仅可以完成较为精细的创建,还可以根据创建步骤编排,生成不同的目标实例。 GOF对建造者模式的描述是: Separate the construction of a complex object from its representation so that the same construction process can create different representations.. — Design Patterns : Elements of Reusable Object-Oriented Software 创建者模式非常适用于产品局部加工过程变化较大,但组装过程相对固定的场景。 比如电脑的组装,基本的组装过程是固定的,但是具体主板、CPU

闲谈设计模式

前提是你 提交于 2020-08-11 02:54:25
闲谈设计模式 Intro 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 了解这些前辈们总结出来的经验有助于帮助你写出来更优秀的代码,帮助你写出可扩展、可读、可维护的高质量代码。 在极客时间里推出了数据结构和设计模式的王争说了一句话,如果说“数据结构与算法之美”是教你写出高效的代码,那设计模式就是教你写出高质量的代码。 为什么要学习设计模式 提升自己代码质量,告别写被人吐槽的烂代码 提高复杂代码的设计和开发能力,设计出扩展性良好,可维护性更强,可复用性更好的代码 让读源码、学框架事半功倍,学会设计模式,在看框架源码的时候会更好的理解框架中的一些功能设计 为你的职场发展做铺垫,提升自己 code review 能力,把控团队代码质量 设计模式设计原则 设计原则是指导我们代码设计的一些经验总结,对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。只有这样,我们才能在项目中灵活恰当地应用这些原则。 单一职责原则 对于一个类而言,应该仅有一个引起它变化的原因 如果一个类承担的职责过多,就等于把这些职责耦合再一起,一个职责的变化可能会削弱或者抑制这个类完全其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。 开放-封闭原则 开放-封闭原则是说软件实体(类、模块、函数等等