SOLID设计模式的六大原则分别是:
- Single Responsibility Principle (SRP): 单一职责原则
- Open Closed Principle (OCP): 开闭原则
- Liskov Substitution Principle (LSP): 里氏替换原则
- Law of Demeter (LOD) : 迪米特法则
- Interface Segregation Principle (ISP): 接口隔离原则
- Dependence Inversion Principle (DIP):依赖倒置原则
【里氏替换原则】
里氏替换原则的原话为:
The derived class must be usable through the base class interface, without the need for the user to know the difference.
里氏替换原则的核心思想是:
一个父类对象在其出现的任何地方,都可以用其子类对象做替换,并且不会导致程序错误。
通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下含义:
1) 子类可以实现父类的抽象方法/虚函数,但不能重定义父类的非抽象方法/非虚函数。
2) 子类中可以增加自己特有的方法。
3) 当子类覆盖父类的方法时,方法的前置条件(形参)要比父类方法的输入参数更宽松,方法的后置条件(即返回值)要比父类更严格。
里氏替换原则有个典型的例子是正方形继承自长方形的问题,当正方形覆盖长方形的setLength()和setWidth()方法时,会导致程序错误,关于这个例子,可以参考:
【迪米特法则】
迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD.
英文原话:
Each unit should have only limited knowledge about other units: only units “closely” related to the current unit.
门面模式(Facade)和中介者模式(Mediator)是迪米特法则的具体应用。
迪米特法则主要是降低类或者说模块之间的耦合性,下面这篇文章描述的很形象:
"
最少知识原则在面向对象编程中的应用
对于对象 O 中的一个方法 m ,m 方法仅能访问如下这些类型的对象:
- O 对象自身;
- m 方法的参数对象;
- 任何在 m 方法内创建的对象;
- O 对象直接依赖的对象;
具体点儿就是,对象应尽可能地避免调用由另一个方法返回的对象的方法。
现代面向对象程序设计语言通常使用 “.” 作为访问标识,LoD 可以被简化为 “仅使用一个点(use only one dot)”。也就是说,代码 a.b.Method() 违反了 LoD,而 a.Method() 则符合 LoD。打个比方,人可以命令一条狗行走,但是不应该直接指挥狗的腿行走,应该由狗去指挥它的腿行走。
"
【依赖倒置原则】
依赖倒置原则的本质是避免具体类之间的直接调用,而是通过抽象类/接口的方式进行调用,下面这篇文章讲解的通俗易懂: