- 一个对象的所有操作统称为接口。
- 拥有同一接口的两个对象为同一类型。
- 类与类型的区别:类定义了对象的接口和数据(内部状态),类型只与对象的接口有关。不同类的对象可以有相同类型。
- 一个类型接口包含另一个类型接口时,我们称它是另一个类型的子类型。另一个类型称之为它的超类型。子类型继承超类型。
- 对象的接口与其实现四分离的,即两个相同接口的对象可以有完全不同的实现。
- 对象发送请求所执行的具体操作与请求有关也与对象本身有关。给对象发送请求所执行的操作在运行时刻才确定时称为动态绑定。
- 一个对象可以在运行时替换为另一个有相同接口的对象,这种可替换性称为多态。
- 对象为类的实例。
- 抽象类的主要目的是为子类定义公共接口,抽象类不能实例化。
- 抽象类中定义而未实现的操作称为抽象操作。
- 非抽象类称为具体类。
- 混入类是给其他类提供接口和功能的类,不能实例化,没有数据成员,要求多继承。
- 针对接口编程而不是针对实现编程。
- 复用方式有两种:类继承和对象组合。类继承为白箱复用,因父类内部细节可见。对象组合为黑箱复用,因用于组合的对象内部细节不可见。
- 类继承方式容易破坏封装性:子类通常强烈依赖父类实现,以至于父类实现发现任何变化(即使接口没变)必然导致子类发生变化,限制了复用性。一个好的解决方案是,只继承抽象类,因为 抽象类通常提供较少实现。
- 对象组合方式不破坏封装性,因为只能通过对象接口访问。因为对象是基于接口写的,所以实现上存在较少依赖关系。
- 优先使用对象组合,而不是类继承。因为对象组合通常针对接口编程,而类继承针对实现编程(第13点)。
- 理想情况下,应该减少创建新的构件,而多使用对象组合去组合已有构件来获得你需要的功能。但实际情况下,已有构件通常不够丰富,不得不使用继承去创建新的构件。
- 经验表明:设计者往往过度使用继承,但依赖对象组合的设计有更好的复用性(或更简单)。
- 委托是一种组合方法,将给A类的请求的处理委托给B类。如果C类与B类有相同的类型,则在需求改变时,可以简单地将B类替换为C类。
- 对象组合的缺点:动态的、高度参数化的软件比静态软件更难于理解,运行低效。(不过从长远来看人的低效才是更主要的。)
- 只有当委托使设计比较简单而不是更复杂时,它才是好的选择。
- ※委托是对象组合的特例?
- 参数化类型=类属=模板。
- 组合面向对象系统中的行为的三种方式:类继承、对象组合、参数化类型。
- 对象组合技术:能再运行时改变被组合的行为,存在间接性,比较低效,滥用降低可读性。
- 类继承:允许提供操作的默认实现,通过子类重定义这些操作,不能运行时改变。
- 参数化类型:允许改变类所用到的类型,不嗯呢运行时改变。
- 聚合:一个对象包含另一个对象,或者是另一个对象的一部分。拥有相同的生命周期。
- 相识:一个对象与另一个对象有“关联”或者“引用”关系。标识了对象间松散的耦合关系。
- 聚合和相识在程序设计语言中无区别,不是由语言机制决定的。
- 聚合:使用少,关系持久。
- 相识:使用多,关系短,更具动态性。
- 获得最大限度复用的关键在于对新需求和已有需求发生变化时的预见性,要求你的系统设计要能够相应地改进。
- 健壮,可根据未来需求变化而花费少量代价复用的设计:
- 间接创建对象,而不是显式地指定一个类来创建对象。
- 减少对特殊操作的依赖,最小单一功能原则,避免把请求代码写死,使改变响应请求的方法变得容易。
- 减少对特定硬件和软件平台的依赖。
- 保持封装性,对用户隐藏实现细节。
- 减少对可能发生变化的算法的依赖。
- 选择松耦合而不是紧耦合。因为紧耦合的类互相依赖,松耦合则提高了一个类本身被复用的可能性。
- 不要通过生成子类来扩充功能,原因:
- 通常很难通过定义子类来扩充功能。
- 需要对父类有深入的了解,破坏了封装性。
- 重定义一个操作可能需要重定义其他操作。
- 一个被重定义的操作可能需要调用继承下来的操作。
- 容易导致“类爆炸”,即扩充一个功能不得不引入许多新的子类。
- 使对类的修改方便。
- 设计模式通过减少依赖性来提高内部复用性。
- 通过孤立和封装被一个操作来消除对特定操作的依赖,可使在不同上下文中复用一个操作变得更简单。
- 设计模式对应用程序、工具箱、框架的作用:
- 应用程序:优先考虑内部复用性、可维护性和可扩充性。
- 工具箱:比应用程序难,强调代码复用,避免假设和依赖。使用工具箱时,写应用的主体,调用你想复用的代码。
- 框架:强调设计复用。必须尽可能灵活、可扩充。使用框架时,复用应用的主体,写主体调用的代码。
- 框架应该配合文档使用,文档对框架极其重要。
- 设计模式与框架的区别:
- 设计模式比框架更抽象。
- 设计模式是比框架更小的体系结构元素。
- 框架比设计模式更加特例化。
- 基于类继承的方法通常会引起类爆炸现象。
网友评论