oop的几个法则:
OCP:open close principle开闭原则:对扩展是允许的,对修改是封闭的,
当我们遇到一个问题时,发现稍微修改一下原来的类就可以满足现在的需求,
那么你是直接修改这个类呢,还是另想他路呢?ocp告诉我们,绝不允许你去修改
原有的类,你可以用派生的方式来解决问题(原有类具有可扩展性)。。比如我想
给TreeView中的TreeNode加一个属性,最直接的方法是修改TreeNode,加上这个属性
就可以了,但是违反了ocp原则,可以写个派生类
LSP:liskov subsititution principle代换原则:核心思想是利用类继承关系中的
向上转型机制,向上转型机制是安全的;使用lsp可以更好地利用多态来实现ocp;
lsp在模式编程中会大量使用,例如:在策略模式中,对于一组策略,将它们封装成
具有相同接口的独立类中,那么对于客户端只需要知道基类TStrategy,就可以实现
让算法、策略变化独立于它的客户端
DIP:Dependency Inversion principle:依赖反转法则:依赖抽象而不是依赖具体
在多层系统架构中,通过代理模式引入的代理层,可以使得原来相互依赖的层之间
实现依赖反转,从而满足层与层之间独立演化的需求;《周易参同契》对修炼内功
的高手有“上德无为,不以察求。下德为之,其用不休”的秘诀,这正暗合了模式
编程的法则。在模式编程中,“上德”是架构的顶层抽象机制,是变中求稳的接口,
它是对事物的高度抽象,是形而上学。“上德无为”是说在抽象层次,通过无为来
体现编程“虚”和“抽象”的一面,因为这时还无法确定真正的需求和实际使用的
真正对象。“不以察求”要求我们跳出具体需求的约束,不去考虑具体的实现代码,
所以依赖的抽象(抽象类或抽象接口)是没有实现代码的。而“下德”是对抽象的
具体实现,“下德为之”,提供了具体类以及真正的代码实现,“其用不休”,才
能满足不断变化的需求,所以依赖抽象而不是依赖具体使我们真正获得了一种以不
变应万变的能。而模式编程的精髓正是在于对抽象编程而不是对具体编程。
ISP:Interface Segregation Principle:接口隔离法则:不应该强迫客户端依赖于
它们用不上的方法。接口隔离原则说的是,因不同的客户端而划分出多个不同的专
用接口,比使用单一的总的接口要好;如果你的类有许多客户端调用,你不必向客
户端开放所有的方法,而只需要为每一个客户端建立特定的接口,然后在类中实现
这些接口就可以了。不好的设计:类Tservice有许多客户端,每个客户端都聚合了
一个FService: TService,但实际上这些客户端需要的服务又不相同;好的设计:
为每个客户端定义一个特定的接口,如:IServiceA,IServiceB,IServiceC,它们
定义了每个客户端所需要的方法,然后还是TService去实现这些接口(服务),但
这个时候显然每个客户端不会相互影响了;所以ISP的总则就是:以客户端来划分接
口,即使两个客户端要相同的方法,这个方法也应该加到两个接口中;备忘录模式的
宽窄接口设计是ISP在模式编程中的典型应用,备忘录对象针对两个客户端:原发器
TOriginator与管理者TCareTaker,提供两个不同的接口
SRP: single Responsibility Principle单一职责法则:一个类应该仅有一个原因导
致其变化;当一个类中包含多个职责,且它们的耦合关系错综复杂时,那么我们需要
分离,把变化分离出去;在模式编程中,代理模式Proxy和访问者模式Visitor都体现
了srp