| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
模式并不是一段特定的代码,而是解决特定问题的一般性概念
算法:提供达成目标的明确步骤
模式:可以看到最终的结果和模式的功能,但需要自己确定实现步骤
模式的描述:
设计模式是针对软件设计中常见问题的工具箱
设计模式定义了一种让团队成员能够更高效沟通的通用语言
惯用技巧:最基础的、底层的模式
构架模式:最通用的、高层的模式
创建型模式:提供创建对象的机制
结构型模式:介绍如何将对象和类组装成较大的结构
行为模式:负责对象间的高效沟通和职责委派
一种范式,其理念是将数据块及数据相关的行为封装成特殊的、名为对象的实体,同时对象实体的生成工作则是基于程序员给出的一系列蓝图,这些蓝图就是类
对象是类的某一个实例
成员变量
方法
状态
类的层次关系
UML:以空心箭头为顶端指向超类:继承
UML:普通箭头表示某个类基于另外的类
UML:空心三角箭头和虚线代表类实现了接口
UML:普通虚线箭头,表示依赖关系
UML:普通实线箭头表示关联关系
UML:空心菱形为末端指向普通实现箭头为顶端表示聚合关系
UML:一段为实心菱形,另一端为实线普通箭头,表示组合关系
面向对象程序设计:
interface表示对象的公有部分
接口只拥有方法
一个子类只有一个父类,但可以实现多个接口
依赖:对类B进行修改会影响到类A
关联:对象A知道对象B,类A依赖类B
聚合:对象A知道对象B,且有B构成。类A依赖与类B
组合:对象A知道对象B,由B构成且管理B的声明周期
实现:类A定义的方法由接口B声明,对象A可视为对象B。类A依赖于类B
继承:类A继承类B的接口和实现,但是可以对其进行扩展。对象A可视为对象B。类A依赖于B
在最底层,可以复用类库、容器、容器和迭代器
框架
中间层【设计模式比框架更小更抽象,是对一组类的关系及其互动方式的描述】
中间层的优点:在于模式提供的复用方式要比框架的风险小
封装变化的内容
面向接口进行开发,而不是面向实现
依赖于抽象类型而不是具体类型
示例:
多态机制能帮助简化代码
组合优于继承
适用场景
优点
初期使用工厂方法模式,随后烟花为使用抽象工厂模式、原型模式、生成器模式
抽象工厂模式通常基于一组工厂方法, 但你也可以使用原型模式来生成这些类的方法
可以同时使用工厂方法和迭代器模式来让之类集合返回不同类型的迭代器
原型并不是基于继承
工厂方法基于继承,但不需要初始化步骤
工厂方法是模板方法的一种特殊形式
抽象工厂模式是一种创建型模式,能创建一系列相关的对象,而无需指定其具体类
抽象工厂模式建议为系列中的每件产品明确声明接口,然后确保所有产品变体都继承这些接口
抽象工厂——包含系列中所有产品构造方法的接口。这些方法返回抽象产品类型
抽象工厂接口创建不同的工厂类。每个工厂类只能返回特定类型的产品
应用程序会在初始阶段创建具体工厂对象,在此之前,应用程序必须根据配置文件或者环境设定选择工厂类别
角色:
适用场景
生成器重点关注如何分布生成复杂对象。抽象工厂专门用于生产一系列相关对象
抽象工厂、生成器、原型都可以用单例模式来实现
工厂
构建方法:创建对象的方法。每个工厂方法模式的结果都是构建方法
静态构建(或工厂)方法:是被声明为static的构建方法。无需创建对象就能在某个类上调用该方法
简单工厂:描述了一个类,它拥有一个包含大量条件语句的构建方法,可根据方法的参数来选择对何种产品进行初始化并将其返回
工厂方法:是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型
抽象工厂:是一种创建型设计模式,能创建一系列相关或相互依赖的对象,而无需指定其具体类
工厂是一个含义模糊的术语,表示可以创建一些东西的函数、方法、类等
构建方法只是构造函数调用的装饰器
当静态构建方法返回一个新对象时,它就成了构建函数的替代品
分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。
生成器模式建议将对象构建代码从产品类中抽取出来,并将其放在一个名为生成器的独立对象中
主管类可定义创建步骤的执行顺序,而生成器则提供这些步骤的实现
生成器模式适合应用场景
实现方法:
生成器重点关注如何分步生成复杂对象,在获取产品前执行一些额外构造步骤
抽象工厂专门用于生产一系列相关对象,会马上返回产品
生成器和桥接模式:主管类负责抽象工作,各种不同的生成器负责实现工作
是一种创建型模式,能够复制已有对象,而又无需依赖它们所属的类
原型模式将克隆过程委派给被克隆的实际对象。模式为所有支持克隆的对象声明了一个通用接口,该接口能让你能够克隆对象。同时又无需将代码和对象所属类耦合。
支持克隆的对象即为原型
运作方式:创建一系列不同类型的对象并以不同的方式对其进行配置。如果所需对象与预先配置的对象相同,那么只需要克隆原型即可,无需新建一个对象
基本实现:
原型注册表的实现
适用场景:
实现方式:
原型可用于保存命令模式的历史记录
原型并不是基于继承,因此没有继承的缺点。但原型需要对被复制对象进行复杂的初始化。工厂方法基于继承,不需要初始化
抽象工厂、生成器、原型都可以用单例模式来实现
能够保证一个类只有一个实例,并提供一个访问该实例的全局节点
单例同时解决了两个问题,所违反了单一职责原则
解决方案:
单列类声明了一个名为getInstance()的静态方法来返回其所属类的一个相同实例
适用场景
外观模式类通常可以转换为单例模式
享元模式vs.单例
如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效
让接口不兼容的对象能够相互合作
适配器:一个特殊的对象,能够转换对象接口,使其能与其他对象进行交互
运作方式:
类适配器不需要封装任何对象,因为它同时继承了客户端和服务的行为。
实现方式:
适配器可以对已有对象的接口进行修改,装饰模式则能在不改变对象接口的前提下强化对象功能
适配器能为被封装对象提供不同的接口,代理模式能为对象提供相同的接口,装饰则能为对象提供加强的接口
外观模式为现有对象定义了一个新接口,适配器则会试图已有的接口。
可将一个大类或一系列紧密相关的类拆分为抽象和实现连个独立的层次结构,从而能在开发时分别使用
桥接模式通过将继承改为组合的方式来解决多个维度类继承问题
将一个类层次转化为多个相关的类层次,避免单个类层次的失控
抽象部分:接口,是一些实体的高阶控制层——程序的GUI层
实现部分:实现——操作系统的API
桥接模式的结构:
桥接模式适合应用场景
实现方式:
桥接、状态模式、策略模式实际上都是基于组合模式
可以使用它将对象组合成树状结构,并且能像使用独立对象一样使用它们
如果应用的核心模型能用树状结构表示,在应用中使用组合模型才有价值
组合模式建议使用一个通用接口来与产品和盒子进行交互,并且在该接口中声明一个计算总价的方法
组合模式以递归方式处理对象树中的所有项目
组合模式解构
适用场景:
实现方式:
可以创建复杂组合树时使用生成器模式
责任链模式通常和组合模式结合使用
可以使用迭代器模式来遍历组合树
可以使用访问器模式对整个组合树执行操作
可以使用享元模式实现组合树的共享节点来节省内存
通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为
当你需要更改一个对象的行为时,扩展它所属的类
使用聚合或组合,而不是继承
封装器是装饰模式的别称,封装器是一个能与其他目标对象连接的对象
封装器实现了与其封装对象相同的接口
装饰模式结构
适用场景:
实现方式:
能为程序库、框架、其他复杂类提供一个简单的接口
结构:
适用场景
实现方式
外观模式为现有对象定义一个新街口,适配器模式则会视图运用已有的接口。适配器通常只封装一个对象,外观通常会作为整个对象子系统上
当只需要对客户端隐藏子系统创建对象的方式时,可以使用抽象工厂模式来替代外观
享元模式展示了如何生成大量的小型对象;外观则展示了如何用一个对象来代替整个子系统
外观 vs. 中介者模式
外观类通常可以转换为单例模式类
外观与代理模式的相似之处在于他们都缓存了一个复杂实体并自行对其进行初始化。代理与其服务对象遵循统一接口,使得自己和服务对象可以互换
缓存、Cache、 Flyweight
摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,可以在有限的内存容量中载入更多对象
对象的常量数据通常被称为内在状态,位于对象中,其他对象只能读取但不能修改其数值。
而对象的其他状态常常能被其他对象“从外部”改变,因此被称为外在状态
享元模式建议不再对象中存储外在状态,而是将其传递给依赖于它的一个特殊方法。程序只在对象中保存内在状态,以方便在不同场景下进行重用。
这些对象的区别仅在于其内在状态(与外在状态相比,内在状态的变体要少很多),因此所需的对象数量会大大消减
更好的解决方案是创建独立的情景类来存储外在状态和堆对享元对象的引用。
一个享元大对象会被上千个情境小对象复用, 因此无需再重复存储数千个大对象的数据
享元与不变性
享元工厂
结构
适合场景
实现方式
可以使用享元模式实现组合模式树的共享叶节点以节省内存
享元展示了如何生成大量的小型对象, 外观模式则展示了如何用一个对象来代表整个子系统
能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进一下处理
代理模式建议新建一个与原服务对象接口相同的代理类,然后更新应用以将代理对象传递给所有原始对象客户端
代理类接收到客户端请求后会创建实际的服务对象,并将所有工作委派给它
代理模式结构
适应场景:
实现方式
行为模式负责对象间的高效沟通和职责委派
责任链,允许将请求沿着处理者链进行发送。收到请求后,每个处理者均可以对请求进行处理,或将其传递给链上的下一个处理者
命令,可将请求转换为一个包含与请求相关的所有信息的独立对象
迭代器,能在不暴露集合底层表现形式的情况下遍历集合中所有的元素
中介者,能减少对象之间混乱无序的依赖关系。该模式会限制对象之间的的直接交互,迫使通过一个中介者对象进行合作
备忘录,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态
观察者,发布订阅模式,vue
状态,能在一个对象的内部状态变化时改变其行为,使其看上去像改变了自身所属的类一样
策略,定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换
模板方法,在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤
访问者,将算法与其作用的对象隔离开来
职责链模式、命令链、CoR、Chain of Command
责任链会将特定行为转换为被称为处理者的独立对象
处理者可以决定不再沿着链传递请求,这可高效地取消后续处理步骤
每个具体处理者仅关心下一个包含execute方法对的处理者。
结构
责任链适合场景
责任链、命令模式、中介模式、观察者模式:
动作、事务、Action、Transaction、Command
可将请求转换为一个包含与请求相关的所有信息的独立对象。
关注点分离
命令对象负责连接不同的GUI和业务逻辑对象
所有命令实现相同的接口。该接口通常只有一个没有任何参数的执行方法,让你能在不和具体命令类耦合的情况下使用同一请求发送者执行不同命令
命令模式解构:
适合场景:
实现方式:
能在不暴露集合底层表现形式的情况下遍历集合中所有元素
将集合的遍历行为抽取为单独的迭代器对象
多个迭代器可以在相互独立的情况下同时访问集合
迭代器通常会提供一个获取集合元素的基本方法
迭代器模式结构:
Intermediary、Controller、Mediator
能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使他们通过一个中介者对象进行合作
组件仅依赖一个中介者类,无需与多个其他组件相耦合
中介者模式结构:
适合应用场景:
责任链模式、命令模式、中介模式、观察者模式用于处理请求发送者和接收者之间的不同连接方式:
Snapshot、Memento
允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态
备忘录模式将创建状态快照的工作委派给实际状态的拥有者原发器对象
备忘录模式结构
适合应用场景:
事件订阅者、监听者、Event-Subscriber、Observer
发布订阅机制
观察者模式结构:
适合应用场景:
能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类
状态模式与有限状态机
状态模式建议为对象的所有可能状态新建一个类,然后将所有状态的对应行为抽取到这些类中
原始对象被称为上下文context,它并不会执行实现所有行为,而是会保存一个指向表示状态的状态对象的引用,且将所有与状态相关的工作委派给该对象
所有状态类都必须遵循同样的接口,而且上下文必须仅通过接口与这些对象进行交互
状态模式结构:
适合应用场景
实现方式:
定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换
策略模式建议找出负责用许多不同方式完成特定任务的类,然后将其中的算法抽取到一组被称为策略的独立类中
上下文的原始类必须包含一个成员变量来存储对于每种策略的引用
上下文可独立于具体策略
策略模式结构:
适应场景:
实现方式
在一个超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤
模板方法模式建议将算法分解为一系列步骤,然后将这些步骤改写为方法,最后在模板方法模式中依次调用这些方法
抽象步骤必须由各个子类来实现
可选步骤已有一些默认实现,但仍可在需要时进行重写
模板方法模式结构:
适合应用场景
实现方式
visitor
能将算法与其所作用的对象隔离开来
访问者模式建议将新行为放入一个名为访问者的独立类中,而不是试图将其整合到已有类中。
双分派
访问者模式结构:
适合应用场景
实现方式:
后期/动态绑定
前期/静态绑定
双分派是一个允许在重载时使用动态绑定的技巧
| Back | FazBrowse Home | New Git URL |