3.1 软件设计的目标
(1)可扩展性
(2)可修改性
(3)可替换性
3.2 “开-闭”原则
“开-闭”原则指软件实体应当对扩展开放,对修改关闭。即软件实体应该在不修改的前提下进行扩展,这个原则为软件设计指明了目标。
3.3 实现“开-闭”原则
3.3.1 面向接口编程
优势:
(1)降低程序各部分间的耦合性,使程序模块互换成为可能。
(2)使软件各部分便于单元测试,通过编制与接口一致的模拟类(Mock),可以很容易地实现软件各部分的单元测试。
(3)易于实现软件模块的互换,软件升级时可以只部署发生变化的部分,而不会影响到其他部分。
3.3.2 封装变化
程序中任何可能发生变化的部分都可以封装为对象,包括命令、事件、属性、算法和状态等。封装变化是实现“开-闭”原则的重要手段,也是设计中发现对象的重要途径。
封装可能发生变化的部分,将可能发生变化作为对象。
3.3.3 采用组合替代继承
采用组合代替继承是在需要复用的前提下,并不是所有的继承都可以用组合替代。
3.4 面向对象软件设计的难点
最难的部分是:如何发现对象和在对象间进行组合。
3.5 设计模式解决的问题
3.5.1 通过显示指定类创建对象(不好的)
如果需求变化,可能要创建不同的对象,因此在实例化时间接创建对象,与这类相关的设计模式有抽象工厂模式、工厂方法模式和原型模式。
3.5.2 紧耦合
紧耦合的类难以复用和维护,修改或删除一个类,必须修改与之相关联的类。
3.5.3 通过生成子类扩展功能
通过子类扩展功能会有很多问题,会引起子类数量增加和类层次的增加。
通过对象组合技术实现功能扩展是很好的选择。
这方面的相关模式有桥接模式、职责链模式、组合模式、装饰模式、观察者模式和策略模式等。
3.5.4 对对象表示或实现的依赖
对象之间有依赖
相关的设计模式有抽象工厂模式、桥接模式、备忘录模式和代理模式等
3.5.5 不能方便的修改类
相关的设计模式有适配器模式、装饰模式和访问者模式等。
3.5.6 对算法的依赖
算法实现的目的是不变的,但是算法本身却不是一成不变的。如果需求变化或功能扩展或软件优化,则可能要修改算法
与此相关的设计模式有生成器模式、迭代子模式、策略模式、模板方法模式和访问者模式。
3.5.7 对软件环境的依赖
希望屏蔽对运行环境的依赖,以确保可移植和可维护性。
与此相关的设计模式有抽象工厂模式和桥接模式等。