做数值计算的,不了解软件开发的模式,很遗憾。
有本书《 scientifc software desgin - object-orients way》,感觉写的重点不突出。又拿到一本中文书:first head 设计模式。周末下午在starbucks 看,比较喜欢,但是经验不多,不知道科学计算软件设计里面,到底怎么用这些模式了。相信以后会慢慢深入的,第一篇,记录。
1 设计原则一: 找出应用中可能需要变化的地方,把它们独立出来。
2 设计原则二: 针对接口编程,而不是针对实现编程。 在类中包括设计行为的方法。
多态: 针对抽象超类,运行时决定具体调用方法。举例: duck类中加 2个实例变量,声明为接口类型; 在子类构造器中将接口变量实例化(new)
3 设计原则三: 多用组合,少用继承。动态设定行为(行为组合 vs 继承)
策略模式:
定义算法簇,分别封装,相互可替换。算法变化独立于算法使用者。
notes: 库,框架的实现就是硬件;设计模式就是软件。
观察者模式:
定义对象之间一对多的依赖
当对象状态改变,所有依赖者都收到同志并自动更新
实现: 主题接口 <------> 观察者接口 : 两者松耦合,只是接口相互通信,实体可自由改变。
4 设计原则四: 为交互对象之间的松耦合而设计
装饰者模式:
装饰者,被装饰者,组件具有相同的超类。通过装饰者与组件组合,引入新行为。
5 设计原则五: 类应该对扩展开放,对修改关闭。 运行时扩展(组合) vs. 编译时继承
工厂模式:
分装创建(new)对象的代码(工厂), 把具体实例化的过程从客户代码中剔除。
工厂方法将创建对象的行为封装在子类中,这样客户程序中关于超类的代码和子类对象创建就解耦。
6 设计原则六: 依赖抽象,不要依赖具体类。
抽象工厂模式:
提供抽象接口,创建一组具体产品。
单件模式:
确保一个类只有一个实例,并提供一个全局访问点。
note: 静态方法 = 类方法; 静态成员变量 = 类变量
多线程优化 <---> 多实例化, synchronized 关键词,确保一个时间,只有一个线程访问该方法
命令模式:
方法调用封装
将请求封装成对象,以便使用不同的请求(来参数化其他对象)
适配器模式:
对象适配器/类适配器
转化插头
外观模式:
减少对象之间的相互交互?
封装算法, 模版; 挂钩的设计,就是为算法可选部分提供挂靠方法;模版中抽象方法,子类中必须实现。
好莱坞原则: 允许底层组件将自己挂钩到系统上,但高层组件决定何时和怎样使用这些底层组件
迭代器和组合模式:
思想:封装变化。
一个类应该只有一个引起变化的原因--保持每个类单一责任
note: framework 保护一群类,接口,集合,迭代器。
事物的状态 -> 改变事物的内部状态来帮助对象控制自己的行为。举例: 定义状态接口,为每个状态实现状态类。将状态的行为放在一个类中,即将行为局部化,同时由行为接口实现。