设计模式 -- 引言
书的目的是将面向对象软件的设计经验作为设计模式记录下来。设计模式主要是做出有利于系统复用的选择,避免设计损害了系统复用性。
什么是设计模式
设计模式描述的是一个不断重复发生的问题以及该问题的解决方案的核心。有四个要素:
- 模式名称:助记词,允许我们在一个较高的,规范的抽象层上进行设计
- 问题:描述了我们应该何时使用模式
- 解决方案:描述了设计的组成成分,它们之间的相互关系以及各自的职责以及协作方式。
- 效果:描述了模式应用的效果以及模式应权衡的问题。
透过 MVC 来看设计模式
MVC 通过建立了一个“订阅/通知”模式来分离视图和模型。视图保证了它的显示正确反映模型的状态。
上面的这个例子是将视图和模型的分离。但是我们可以抽象出更一般的问题,我们可以使得对象分离。使一个对象的改变能够影响到另一些对象,而这个对象不需要知道哪些被影响的对象的细节。这个被描述为 Observer 模式。
MVC 的另一个特征是视图可以嵌套,就是 Composite 模式。
将一些对象划分为一组,并将该组对象当做一个对象来使用。
MVC 允许我们在不改变视图外观的情况下改变视图对用户输入的响应方式。这其实是种策略模式。用在我们想动态或者静态地替换一个算法的时候。
MVC 还使用了其他的设计模式,比如工厂方法笔记装饰器模式,但主要的还是上面的 3 个。
描述设计模式
- 模式名和分类:简洁描述了模式的本质。
- 意图:做什么的,原理以及解决的问题
- 别名:模式的其他名字
- 动机:说明一个设计问题以及如何用模式中的类,对象来解决该问题的特定情景。
- 适用性:什么情况下使用,可以改良什么不良设计
- 结构:采用基于对象建模技术的表示法对模式中的类进行图形描述
- 参与者:模式中的类以及它们各个的职责
- 协作:参与者怎样协作以实现它们的职责
- 效果:模式怎么支持他的目标,以及权衡取舍
- 实现:实现模式的提示,技术要点
- 代码示例
- 已知的应用
- 相关模式
罗列了下所有的模式,暂时不看
组织编目
根据目的准则分为了创建型,结构型和行为型 3 种。
- 创建型
- 结构型
- 行为型
创建型与对象的创建有关;结构型处理类或对象的组合;行为型对类或对象怎样交互以及怎样分配职责进行描述。
根据范围准则,就是用于类还是用于对象。
- 类模式:处理类和子类之间的关系,通过继承建立,静态的
- 对象模式:处理对象间的关系,运行时刻变化的,具有动态性
创建型类模式将对象的部分创建工作延迟到子类。创建型对象模式就是将它延迟到另一个对象中。结构型类模式使用继承机制来组合类。结构型对象则描述了对象的组装方式。行为型类模式使用继承描述算法和控制流。行为型对象模式描述一组对象怎么协作完成单个对象无法完成的任务。
有的时候模式被绑在一起使用,有些模式是可替代的,有些模式虽然意图不同,但是产生的设计结果是很相似的。
这里给了张设计模式之间的关系图(可以在看完整本书之后再来瞧瞧)
设计模式怎样解决设计问题
面向对象设计最困难的是将系统分解成对象集合。
对象所定义的所有操作型构的集合被称为该对象的接口。当一个类型的接口包含另一个类型的接口时,他就是另一个类型的子类型,另一个类型称之为他的超类型。我们常说子类型继承了他的超类型的接口。
在面向对象的系统中,接口是基本的组成部分。对象的接口与其功能实现是分离的。不同的对象可以有不同的实现。两个相同接口的对象可以有完全不同的实现。发送给对象的请求和他的响应操作在运行时刻的连接就是动态绑定。动态绑定允许在运行时刻替换有相同接口的对象,这种替换性就是多态。多态使得对象间独立。
抽象类主要目的是为了他的子类定义公共接口。把它的部分或者全部操作的实现延迟到子类中。抽象类不能被实例化。非抽象类称为具体类。
混入类也是给其他类提供可选择的接口或者功能的类。一样不能实例化,要求多继承。
面向接口编程,而不是对实现编程。可以大幅度减少子系统之间的相互依赖关系
运用复用机制
面向对象中最常用的就是继承和组合的方式,继承和组合的比较:
继承是根据一个类实现来定义另一个类的实现,通过白箱复用。对象组合是通过组装或组合对象来获得。是一种黑箱复用的形式。
类继承的不足在于,我们没法改变父类中的实现,而且父类至少定义了某些子类的具体表示。父类的任何改变都可能影响到子类。一个可用的办法是只继承抽象类。因为抽象类只提供较少的实现。
对象组合就是通过一系列对象提供的接口来实现功能。可以减少耦合。
所以我们应该优先使用对象组合,而不是类继承。
委托
就是说接受请求的对象,将操作委托给他的代理者。让他的代理者来处理。是组合的一种方式,而不是继承。感觉这个和 react 里面通过 refs 来调用子控件的方法很类似。
参数化类型
还有种复用的方式就是参数化类型,就是不指定用到的其他所有类型,而是未指定的类型以参数的形式传递。这个使用不多,不细讲了。
考虑对象聚合和相识
聚合意味着一个对象拥有另一个对象或对另一个对象负责。聚合对象和其拥有者具有相同的生命周期。
相知意味着一个对象仅仅知道另一个对象,可能请求彼此的操作,不为对方负责。这两个玩意很容易混淆,因为他们是用同一个方法实现的。
设计应支持变化
最大限度的复用关键是对新需求和已有需求发生变化的预见性。在下面 3 种主要软件中起的作用:
- 应用程序:主要是减少依赖提供内部复用性,通过松散耦合来增强一类对象和其他多个对象协作的可能性。
- 工具箱:他要求对许多应用是可用和有效的,避免假设和依赖就变得很重要。
- 框架:框架规定了应用的体系结构,定义了各部分的责任以及控制流程。框架得找出一个适用于所有应用的体系结构。当框架和使用的设计模式写入文档时,了解设计模式的人能很快的洞悉框架。
模式和框架的区别
- 设计模式比框架更抽象:框架能够用代码表示,而设计模式只有其实例才能表示为代码。
- 设计模式是比框架更小的体系结构元素:框架可以包含多个设计模式
- 框架比设计模式更加特例化
怎样选择设计模式
- 考虑设计模式如何解决问题
- 浏览模式的意图
- 研究模式如何相互关联
- 研究目的相似的模式
- 检查自己重新设计的原因
- 考虑设计那些是可变的
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com
文章标题:设计模式 -- 引言
文章字数:2.2k
本文作者:泽鹿
发布时间:2019-08-28, 16:45:23
最后更新:2019-08-28, 16:45:23
原始链接:http://panyifei.github.io/2019/08/28/读书笔记/设计模式/1章引言/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。