读书笔记-设计模式-引言
什么是设计模式
特定场景下一类问题的通用解决方案。
需要说明的是,设计模式跟所使用的编程语言是很相关的。 比如,面向对象语言中的一些行为型模式在函数式语言中就不需要,而在面向对象语言直接支持「继承」、「封装」和「多态」,如果要在过程式语言中实现,也就需要特殊的「模式」了。 所以,所谓的模式跟编程语言自身的能力息息相关。
四个基本要素
- 模式名
- 问题 解决的是什么样的问题
- 解决方案
- 效果
设计模式怎样解决设计问题
寻找合适的对象
面向对象程序由对象组成,对象包括数据和对数据进行操作的方法。对象在受到客户的请求(消息)后,执行相应的操作。 客户请求是使对象执行操作的唯一方法,操作又是改变对象内部状态的唯一方法。
面向对象设计最困难的部分是将系统分解为对象集合。
面向对象设计方法学
- 写出问题描述,挑出名词和动词,进而创建相应的类和操作
- 关注于系统的协作和职责关系
- 对现实世界进行建模,再将分析时发现的对象转化到设计中
各方法的优劣并无定论
设计模式如何起作用
帮你确定并不明显的抽象和描述这些抽象的对象,使设计更灵活、复用性更好。
决定对象的粒度
指定对象接口
操作的型构signature
对象声明的每一个操作指定操作名、作为参数的对象和返回值
对象的接口interface
所定义的所有操作型构的集合。描述了该对象所能接受的全部请求的集合。
类型type
是用来标识特定接口的一个名字。 一个对象可以有许多类型,且不同的对象可以共享同一个类型。 当一个类型的接口包含另一个类型的接口时,我们说它是另一个类型的子类型subtype,另一个类型则称为它的超类型supertype。 子类型继承了它的超类型的接口。
接口的实现
对象接口和其功能实现是分离的,两个具有相同接口的对象可以有完全不同的实现。
动态绑定
客户发送请求只需要看接口,但请求具体怎么被处理,要到运行时刻才受具体对象的具体实现约束。
多态polymorphism
动态绑定允许你在运行时刻彼此替换有相同接口的对象,这种可替换性叫多态。
设计模式如何起作用
- 通过确定接口的主要组成部分以及经接口发送的数据类型,来帮我们定义接口。
- 指定接口之间的关系。
描述对象的实现
实例化
由类创建一个对象,需要分配存储空间,并将操作与对象的内部数据联系起来。
类继承
子类包含父类定义的所有数据和操作。子类能够改进和重新定义它们父类的操作。
抽象类
为子类定义公共接口。
混入类mixin
是给其他类提供可选择的接口或功能的类。与抽象类一样不能被实例化。mixin要求多继承。
类class和类型type的区别
一个对象的类定义了对象是怎样实现的,同时也定义了对象的内部状态和操作的实现。 对象的类型只与它的接口有关,接口即对象能响应的请求的集合。
类继承和接口继承的区别
类继承根据一个对象的实现定义了另一个对象的实现,是代码和表示的共享机制。主要为了复用。 接口继承描述了一个对象什么时候能被用来替代另一个对象。主要为了多态。 C++中,纯接口继承,接近于公有继承纯抽象类;纯实现继承或纯类继承接近于私有继承。
针对接口编程
不将变量声明为某个特定的具体类的实例对象。不得已时,用创建型模式。
运用复用机制
继承与组合
实现功能复用的两种最常用技术是:类继承和对象组合,前者为白箱复用,后者为黑箱复用。 对象组合使设计更灵活,但是动态的、高度参数化的软件比静态软件更难以理解,而且还有运行低效的问题。 应该优先使用对象组合。 经验表明,设计者往往过度使用了继承这种复用技术。
委托
委托是对象组合的特例。
继承和参数化类型
C++ template
关联运行时刻和编译时刻的结构
如果将编译时刻的代码结构比作静态的动植物分类,那么运行时刻结构就如活生生的生态系统。
设计应支持变化
先预测可能会发生哪些方面的变化,然后将这些变化抽象出来。
设计模式的分类
- 创建型模式 单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
- 结构型模式 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
- 行为型模式 模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。